読者です 読者をやめる 読者になる 読者になる

富豪的バックアップのススメ

間違ってrmしてしまったっ!! ということは誰しも一度はあると思いますが、そう言うときのためにもバックアップやバージョン管理は重要なわけです。
しかしバックアップは1時間に1回や1日に1回程度しか行わないので、たとえば5分前に変更したプログラムをrmしてしまったら、その5分間の変更は水の泡です*1。何という損失!
中でもやる気の損失が激しい。

上書き保存するたびにバックアップ

そこで、これは受け売りなのですが、エディタでファイルを保存するときに常にバックアップを残すようにしています。
当然のことながら凄まじいファイル数になりますが、エディタで編集するのは大方プログラムや設定ファイルなので大した容量にはなりません。今私のバックアップディレクトリを見てみると 2008年4月2日16時15分30秒 から累積して約5万個のファイルが残っていますが、サイズは 400MB 程度です。
今時のHDDからすればこの程度の容量はゴミみたいなモノなので、それでやる気の大暴落を防げるなら安い買い物です。


エディタに vim を使っているなら、~/.vimrc に以下のように書いておくと上書き保存するたびにバックアップを作成してくれます。

set backup
set backupdir=$HOME/.vim-backup  " このディレクトリはあらかじめ作っておく。chmod 700 するのを忘れずに
let &directory = &backupdir

autocmd BufWritePre,FileWritePre,FileAppendPre * call UpdateBackupFile()
function! UpdateBackupFile()
    let basedir = "$HOME/.vim-backup"
    let dir = strftime(basedir."/%Y%m/%d", localtime())
    if !isdirectory(dir)
        let retval = system("chown frsyuki:staff ".dir)   " ここのユーザー名とグループを変える
    endif
    exe "set backupdir=".dir
    let time = strftime("%H_%M_%S", localtime())
    exe "set backupext=.".time
endfunction

もちろん emacs でもできるかと。

ファイルを変更するたびにディレクトリ全体をバックアップ

バックアップはリストアするためにあるわけですが、例えば C++ のプログラムを書いているとヘッダとソースはペアでリストアしたくなります。そんなわけでファイルが1つでも変更されたらソースツリー全体をバックアップするスクリプトを使っています。
元々はファイルの変更を監視して自動的に make してくれるスクリプトが欲しかったから作ったのですが、ついでにバックアップを残すようにしてみました。


指定したglobパターンにマッチするファイルが変更されると、globパターンにマッチするファイルを全部バックアップします。Makefile があればついでに make します。.git ディレクトリがあればついでに git status を表示します。なかなか便利な奴です。

# "*.rb" にマッチするファイルを監視してバックアップ
$ kansit "*.rb"

# *.cc, *.hpp, *.c, *.h にマッチするファイルと Makefile.am を監視。サブディレクトリ以下も監視。
$ kansit -s "*.{cc,hpp,c,h}" "Makefile.am"

# カレントディレクトリ以下のファイルが1つでも変更されたら、../copyto に rsync する
$ kansit -s "."  -c "rsync -a . ../copyto"

コマンドを実行するときは心の中で 監視ィット! と叫ぶと良いようです。
ファイルが変更される他にも Enter キーを押すと強制的に反応します(-xで無効化可能)
kansit を実行したディレクトリに on_update という名前の実行可能なファイルがあると、色々する代わりにそれを実行します。


kansit のソースは gist:152480 にあります:ダウンロード

$ wget http://gist.github.com/raw/152480/41cf559e358fd4dc505af6679d382c3a5bcda3ad/kansit
$ chmod 755 kansit
$ sudo cp kansit /usr/local/bin/
$ mkdir ~/.kansit-backup
$ chmod 700 ~/.kansit-backup

*1:いろいろツッコミはありそうですが^^ 誰しもポカすることはあるハズで。git add するつもりが rm してしまった!!