git: missing tree が出てしまった時の対処

MATLABのProjectで「Gitステータスを更新」しようとしたら、missing tree と出てしまった。

Project上のファイルを編集・更新しようとするたびに、エラーが出る。

(“premature end of pack file”などのエラーも下記の方法で対処できる。”dangling blob”が多く出る場合はこうする以外ないのか?)

不幸中の幸いなのか、コマンドライン(Git Bash)からはcommitもpushもできる。 なので、ひとまず更新したファイルをすべてcommit, リモートレポジトリにpushしておいた。

試しにgit fsck –fullした結果は以下のような感じ:

$ git fsck --full
error: unable to mmap C:/Users/USERNAME/OneDrive - MYCOMPANY/PjDir/.git/objects/57/b0a95b3e13a6650f7ab5e808b03c1d8f261de6: Invalid argument
error: 57b0a95b3e13a6650f7ab5e808b03c1d8f261de6: object corrupt or missing: C:/Users/USERNAME/OneDrive - MYCOMPANY/PjDir/.git/objects/57/b0a95b3e13a6650f7ab5e808b03c1d8f261de6
Checking object directories: 100% (256/256), done.
Checking objects: 100% (484/484), done.
error: 57b0a95b3e13a6650f7ab5e808b03c1d8f261de6: invalid sha1 pointer in cache-tree
broken link from    tree dfc3a51523e71dd9b92c6ec50d1fa9b723ba7bed
              to    tree 57b0a95b3e13a6650f7ab5e808b03c1d8f261de6
missing tree 57b0a95b3e13a6650f7ab5e808b03c1d8f261de6
dangling blob ea00d15c0a3eba699ac248ad679770665286369d
dangling blob f5b2c41f4b40ef56d1cdfe829859f38659ac91d1
dangling blob 61f3aba3aaebf88a8f02f2fc10ae6424083fc18e
dangling blob b7a37bffa59ffc16bbd08b43d30af4806ef28247
dangling blob e6131bced392c58bd85bd2cf0238fd4ed9fae8e7
dangling blob a6d48f9eb838292c5ab7b41363e667973f2de9ba
dangling blob ac35f2493f14c289a3e6966c1707b879d13ffd82
dangling blob e87524647e9bcd68112c47751b357899fe06f777
dangling blob 03679b309eeef9e1952330eefe88eac31f162bc2
dangling blob 32e7993c30078c9b04f6d382b10dac7b0044d534
dangling blob 83078db4a97f2f3c980d93a350f26ed4aa43802e
dangling blob ec3796d228008ab1a77bbe7de7155df268395ede
dangling blob adb9d1f5618cc71a3ecff8192874deb020d3bc8d
dangling blob c2cb114f6b941f364aaf17f55cf93b867aa8b53a
dangling blob 39bc3c8f640bd3947c7eba8040b8f7788a5ce704
dangling blob cf1cb9190362f03bbe7dfc28af12fae73903eca9
dangling blob 0ebd0264deb579b44862e463e9333f3920fe0061
dangling blob abed1a94c4dd204f8846e57a013d49a74174c902
dangling blob d0dd21b6ada9ba9f65380fd45c2800b4f5f98eb3
dangling blob 2bbe954640c390cff1b1aad4b47b4f6591ec30fb
dangling blob ecfe09c9d5d0c3955c65f021a8625bc51eb2c060
dangling blob 02cfc21007067d6ae45f1e656f8e0290ba6e6665
dangling blob 2bef57262fa1059814b889c4cfa6f09ac7c5b18b

ググっても日本語の情報はあまりない。 参考になったのは How can I fix a corrupted Git repository? – Stack Overflow だ。(リンク先が変だったので修正した 2024-06-13)

結局以下の通りやった。(${url}はリモートレポジトリのurlに置き換える)。

mv -v .git .git_old
git init 
git remote add origin "${url}" 
git fetch                   
git reset origin/master --mixed

最後のgit reset origin/master --mixedは必要だ。これをやらないと履歴が回復できない。

今回はこれで解消したが、いつもこのやり方でOKかは分からない。 ローカルのレポジトリが壊れている時は試してみる価値はあると思う。