プログラミング

Gitのfatal: not a git repositoryを直す方法|git initの前に現在地を確認

Gitでnot a git repositoryが出たとき、PowerShellの現在地・プロジェクトのパス・.gitを確認する手順を解説。ZIPとcloneの違い、新規初期化の判断、練習の解答も紹介します。

git statusを実行したら、こんなエラー。昨日まで使えたつもりだと、Gitが壊れたのかと焦りますよね。

fatal: not a git repository (or any of the parent directories): .git

まず確認したいのは、ターミナルが今どのフォルダーにいるかです。別の場所にいるだけなら、正しいプロジェクトへ移動して直せます。git initを実行するかどうかは、その後に判断します。

この記事は、WindowsのPowerShellを中心に説明します。パスは説明用なので、自分のプロジェクトの場所へ置き換えてください。

エラーは「この場所にGitの管理情報が見つからない」という意味

リポジトリは、ファイルと変更履歴をGitで管理する場所です。通常の作業用リポジトリには、履歴などの管理情報を持つ.gitという場所があります。

C:\study\my-site\
├─ .git\
├─ index.html
└─ style.css

Gitは現在地やその親フォルダーから管理情報を探します。この例ならmy-siteの中にいる必要があり、隣のフォルダーや、その外からは同じように扱えません。リポジトリ内のサブフォルダーからは、多くのGitコマンドを使えます。Git公式:リポジトリの構成

なお、今回のエラーはGit自体が動いた結果です。gitは認識されませんというメッセージなら、Gitのインストールやコマンドの検索先の問題なので、対処が異なります。

PowerShellで現在地とファイルを確認する

まず次を実行します。どちらも状態を読むだけです。

Get-Location
Get-ChildItem -Force

Get-Locationは現在地、Get-ChildItem -Forceは隠し項目も含む一覧を表示します。Microsoft:Get-Location、Get-ChildItem

現在地がC:\Users\userで、プロジェクトがC:\study\my-siteなら、移動します。

Set-Location -LiteralPath 'C:\study\my-site'
git status

パスに空白があっても扱えるよう、引用符で囲んでいます。-LiteralPathは、その文字列を実際のパスとして扱う指定です。

On branch mainや変更ファイルの一覧が出れば、リポジトリとして認識されています。main以外のブランチ名でも正常です。変更ありは、Gitが壊れているという意味ではありません。

どのプロジェクトを見ているか、パス全体で確かめる

認識できたら、次を実行します。

git rev-parse --show-toplevel

作業フォルダーの一番上のパスを表示するコマンドです。C:/study/my-siteのように出たら、VS Codeで編集しているプロジェクトのパスと比べます。Git公式:git rev-parse

デスクトップにもDocumentsにもmy-siteがあると、名前だけでは区別できません。違うコピーで編集していた場合、Gitが正常でも目的の変更は見つかりません。

VS Codeでは、エクスプローラーのプロジェクトフォルダーを右クリックし、統合ターミナルで開く方法もあります。既に開いているターミナルは別の現在地を保っている場合があるため、最後はGet-Locationで確認するのが確実です。VS Code公式:ターミナル

.gitは必ずフォルダーとは限らない

別の作業場所を使うworktreeや、別リポジトリを組み込むsubmoduleでは、.gitが管理情報の場所を示すファイルの場合もあります。空の.gitフォルダーを手動で作ったり、ファイルだからと削除したりしないでください。

正しいプロジェクトなのにエラーが続く場合は、コピーや移動で参照先が変わっていないか確認します。管理情報を削除してやり直すと、必要な履歴を失うおそれがあります。

ZIPで取得した場合と、新しく作る場合を分ける

GitHubからZIPをダウンロードした場合

通常のソースコードZIPには、Gitの履歴管理情報は含まれません。ファイルを読んだり動かしたりできても、Gitの作業用リポジトリとは別です。

既存の履歴を引き継ぎたいなら、GitHubのCodeに表示されるURLを使い、git cloneで別の空の作業場所へ複製します。すでに編集したZIP側のファイルは残し、必要な変更だけ後で比べて移してください。URLは自分の対象リポジトリのものを使います。GitHub公式:リポジトリのクローン

自分で作った、まだ履歴のないプロジェクトの場合

このフォルダーから新しくGit管理を始めると決めた場合は、プロジェクト直下で実行します。

git init
git status

git initは管理情報を作る操作で、既存のGitHubの履歴をダウンロードする操作ではありません。最初のコミットまでの手順は、Gitで変更履歴を残す練習へ進んでください。Git公式:git init

親のC:\studyで初期化すると、本来管理したいmy-siteより広い場所を対象にしてしまいます。現在地の確認を先にするのは、この取り違えを防ぐためです。

練習:初期化せずにエラーを直す

次の構成で、現在地はC:\study\memoです。my-siteの変更を確認したくてgit statusを実行したら、今回のエラーが出ました。

C:\study\
├─ my-site\
│  ├─ .git\
│  └─ index.html
└─ memo\
   └─ note.txt

最初に何を行い、その後どう確認すればよいでしょうか。

模範解答

PowerShellで次を実行します。

Get-Location
Set-Location -LiteralPath 'C:\study\my-site'
git status
git rev-parse --show-toplevel

解説

memoからmy-siteは探せないため、作業したいリポジトリへ移動します。最後に表示される最上位のパスがC:/study/my-siteなら、対象を確認できます。

この場面でmemoへgit initする必要はありません。まず現在地を読み、目的のフォルダーへ移動するだけでよいケースです。

Gitは使えるのにGitHubへ送れない場合は、pushとpullの基本を確認してください。non-fast-forwardと出る場合は、pushが拒否されたときの確認手順で履歴の違いを調べます。

← 記事一覧へ戻る