環境
この記事では、vagrant上のCentOS 7 、git 2.12.0 を使用している。
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
$ git --version
git version 2.12.0
症状と原因
git pull
で最新のコミットを取ってこようとすると、以下のエラーが出て失敗。
GITの参照が壊れているから、参照先が解決できないので、ローカルの参照は更新できませんよ~、と。
$ git pull
error: cannot lock ref 'refs/tags/v1.3.38': unable to resolve reference 'refs/tags/v1.3.38': reference broken
From github.com:repo/project-name
! [new tag] v1.3.38 -> v1.3.38 (unable to update local ref)
その壊れているファイルはどうなっているかと言うと、
$ cat .git/refs/tags/v1.3.38
$
空のファイルとなっていた。
このディレクトリにはバージョンのハッシュが記載されたファイルが配置されている。
だが v1.3.38
に関しては空なので参照することができないとのことだ。
ブルースクリーンでPCが落ちてからこの症状が続いているので、書き換え中か何かに落ちたか、ディスクが壊れたのかと思われる。
対策
以下のgit gc
コマンドを実行すると、余計なファイルが削除されて最適化されて直る場合があるそうだ。
だが、今回のケースでは直らなかった。
$ git gc --prune=now
$ git remote prune origin
なので、手動で壊れたファイルを削除する。
$ rm .git/refs/tags/v1.3.38
$ git pull
From github.com:repo/project-name
* [new tag] v1.3.38 -> v1.3.38
Updating 3b1491d2..0ffa0fcb
Fast-forward
...
...
$ cat .git/refs/tags/v1.3.38
7e5aaf5ac820aaafa75329def011e3111a9c3f87
削除したタグのファイルが復活して、マージされた。
これで解決😉