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が拒否されたときの確認手順で履歴の違いを調べます。