fatal: Not a git repository と怒られたときの対処法

不具合対応

私の環境でfatal: Not a git repositoryが発生した際の現象と原因、対策を記載します。

現象

submodule を含むgit リポジトリをclone した上で、ディレクトリ名を変更するとfatal: Not a git repository と怒られる。

$ git clone --recursive <git repo>
$ mv <old_repo_name> <new_repo_name>
$ cd <new_repo_name>
$ git status
fatal: Not a git repository: /path/to/<old_repo_name>/.git/modules/<submodule_name>

原因

submodule 内の.git ファイルのパスが絶対パスで記載されることが原因だった模様。リポジトリ名を変更したことで記載されたパスにファイルが存在しないことになり、エラーが発生していた。

$ cat <submodule_path>/.git
gitdir: /path/to/<old_repo_name>/.git/modules/<submodule_name>

対策

念の為バックアップをとった上で、submodule 内の.git ファイルのパスを変更すればOK。

$ cp <submodule_path>/.git <submodule_path>/.git.backup
$ vim <submodule_path>/.git
$ diff .git.backup .git
1c1
< gitdir: /path/to/<old_repo_name>/.git/modules/<submodule_name>
---
> gitdir: /path/to/<new_repo_name>/.git/modules/<submodule_name>
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

ファイルパス変更後は各種git 操作が問題なく可能になる。

お試し事項

絶対パスではなく相対パスなら問題ないのでは?と考えたので試してみた。

$ cp <submodule_path>/.git <submodule_path>/.git.backup
$ vim <submodule_path>/.git
$ diff .git.backup .git
1c1
< gitdir: /path/to/<old_repo_name>/.git/modules/<submodule_name>
---
> gitdir: ../.git/modules/<submodule_name>
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

ディレクトリ名を変更したりしてみたが、現時点では特に問題なく動作している。最初から相対パスにしてくれればいいのに・・・とも思ったが、自分が知らないだけで何か事情や設定があるのかも。