/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

なるほど最終コミットでは HEADd4369d から 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/masterd4369d に書き換えたら,git log がまた動いた! git reset --hard HEAD@{1} に相当する操作をしたはず.(cf. git-reflog(1))
その後 git gc とか git fsck とか適当に繰り替えして終了.おっと, etckeeper を無効にするために取り除いておいた /etc/apt/apt.conf.d/05etckeeper を元の位置に戻すのを忘れずに.