分かりやすいタイトルが思い浮かばなかった……。
詳細は記事を参照ください。
事象について
Git(GitHub)で開発をしていましたが、ブランチを作るだけ作ってそのままとしていた為、整理の為に昔のブランチを削除しました。
削除はGitHub上で実施しましたが、その中に大文字小文字が異なるだけで同名のブランチが存在していました(例: HOGE、hoge)。
整理が終わり、ローカルでフェッチ( git fetch --prune )を行った所、以下のエラーが出ました。
# git fetch --prune
error: could not delete references: cannot lock ref 'refs/remotes/origin/hoge': Unable to create '/home/xxx/.git/refs/remotes/origin/hoge.lock': File exists.
Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.
From https://github.com/XXXX/xxxx
- [deleted] (none) -> origin/HOGE
- [deleted] (none) -> origin/hoge
この後再度フェッチを行っても同様のエラーが出てしまい、ローカルに反映されませんでした。
ブランチ一覧を参照すると以下のようになっていました。
# git branch -a
* master
remotes/origin/HOGE
remotes/origin/hoge
解決方法
問題となっているブランチのいずれかを以下のコマンドで削除しました(今回は大文字の HOGE を削除)。
# git branch -r -d origin/HOGE
Deleted remote-tracking branch origin/HOGE (was abcd1234).
この後フェッチをした所、エラーが出ることなく処理が完了しました。
# git fetch --prune
From https://github.com/XXXX/xxxx
- [deleted] (none) -> origin/hoge
原因の推察
検証が出来ていませんが、恐らくWindowsのファイルシステムの仕様が関連しているのでは?と思われます。
ホストマシンはWindowsを使用し、Docker(Dev Container)でLinuxのコンテナ上で開発を行い、そこでgitコマンドを実行していましたが、ローカルリポジトリのある領域はホストマシンであるWindows上のフォルダをマウントしていました。
docker-compose の定義としては以下のようなイメージです(該当箇所のみ記載)。
volumes:
- "../mnt:/home/user/src"
Windowsのファイルシステムは大文字小文字を区別しない為、ロックファイル(.git/refs/remotes/origin/[ブランチ名].lock) が意図しない挙動になったものと考えています。
なので、コンテナ内の領域で作業をした場合や、Mac OSやLinux上のディレクトリをマウントした領域の場合はこの現象が起こらない……はず?