人間誰しも消すべきでないリポジトリを誤って rm -r
してしまうことがある。
$ rm -r repo
override r--r--r-- uasi/staff for repo/.git/objects/48/a35a5fffec3890bb52584a98898aa2b02a719a? ^C
ヤバいと思って ^C しても後の祭りだ。一番大事な .git/objects
以下のファイルはリードオンリーなので辛うじて残るが、 .git/HEAD
やら .git/config
やらは消えてしまっている。
こういう悲しい事件は二度と起こらないようにしよう。ミスによる削除を防ぐには、リードオンリーなファイル .git/!
を作ればよい:
$ touch repo/.git/\!
$ chmod a-wx repo/.git/\!
"!" はスペースを除く印字可能な文字の中でもっとも小さい ASCII コードを持つ。 rm
は辞書順でファイルを削除するので、最初に .git/!
を消そうとする(が、そうでないこともある→コメント参照)。そして:
$ rm -r repo
override r--r--r-- uasi/staff for repo/.git/!?
“上書き(オーバーライド)”を“確認(コンファーム)”ってくれる・・・。
ここでキャンセルすれば .git/
の中身はすべて無事に rm -r
から生き延びる。
なお rm -rf
されるとあっけなく消えるのでそのつもりで。
余談: git init
時に .git/!
を配置するよう、テンプレートディレクトリ /usr/local/share/git-core/tmeplates
に !
を入れたが、コピー時にファイルが書き込み可能になってしまってうまくいかなかった。