20
21

More than 5 years have passed since last update.

間違って Git リポジトリを rm -r して色々消える事件が二度とないようにする

Last updated at Posted at 2014-10-17

人間誰しも消すべきでないリポジトリを誤って 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! を入れたが、コピー時にファイルが書き込み可能になってしまってうまくいかなかった。

20
21
4

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
20
21