LoginSignup
13
4

More than 3 years have passed since last update.

reference brokenでgit pullできなくなったときの対策

Last updated at Posted at 2019-12-08

環境

この記事では、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

削除したタグのファイルが復活して、マージされた。
これで解決😉

参考にした文献

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4