/etc/.git 最低限の復旧
aptitude install
の引き起こしたクラッシュで(時間的な前後関係はよく覚えてない) etckeeper(8)
の保守する /etc/.git
の最新コミットが壊れた件 (id:flalin:20111203:1322901223).git reflog
が見てるデータを直にエディタで見るとよいと知った:
root@zbox:~/dot.git# tail -3 logs/HEAD cc3e780842f43080804a1011ac238b02852cf193 c72122c252d96548e817c4985650f0eb7bb7bc15 root <root@zbox> 1322414962 +0900 commit: saving uncommitted changes in /etc prior to apt run c72122c252d96548e817c4985650f0eb7bb7bc15 d4369dcbc08808c0832a975dbb655085eaa6ab9e root <root@zbox> 1322414985 +0900 commit: committing changes in /etc after apt run d4369dcbc08808c0832a975dbb655085eaa6ab9e 1be92992c2c059ce099238656db331c29d002888 root <root@zbox> 1322850851 +0900 commit: saving uncommitted changes in /etc prior to apt run
なるほど最終コミットでは HEAD
が d4369d
から 1be929
に変わったと.そして 1be929
が(前回貼ったように)git log
中にエラー表示される.
root@zbox:~/dot.git# ll objects/1b/e92992c2c059ce099238656db331c29d002888 -r--r--r-- 1 root root 0 12月 3 03:34 objects/1b/e92992c2c059ce099238656db331c29d002888
ぉーん.こいつ(最後の aptitude install
のログだろう)は,もう失われてしまったので捨てるより他に無い.それ以前のログを生かして継続するために作業している.
Vimで直に編集するしかない.
root@zbox:~/dot.git# grep -nHr 1be9 * logs/refs/heads/master:125:d4369dcbc08808c0832a975dbb655085eaa6ab9e 1be92992c2c059ce099238656db331c29d002888 root <root@zbox> 1322850851 +0900 commit: saving uncommitted changes in /etc prior to apt run logs/HEAD:128:d4369dcbc08808c0832a975dbb655085eaa6ab9e 1be92992c2c059ce099238656db331c29d002888 root <root@zbox> 1322850851 +0900 commit: saving uncommitted changes in /etc prior to apt run refs/heads/master:1:1be92992c2c059ce099238656db331c29d002888
logs
以下のファイルの最終行にあった 1be929
を含む行を削り,refs/heads/master
を d4369d
に書き換えたら,git log
がまた動いた! git reset --hard HEAD@{1}
に相当する操作をしたはず.(cf. git-reflog(1))
その後 git gc
とか git fsck
とか適当に繰り替えして終了.おっと, etckeeper を無効にするために取り除いておいた /etc/apt/apt.conf.d/05etckeeper
を元の位置に戻すのを忘れずに.
- http://stackoverflow.com/questions/8271263/repair-corrupted-git-repository corruption - Repair corrupted git repository - Stack Overflow