Hatak::Techlog

Verba volant, scripta manent.

Git のバックアップ

分散 SCM とはいえ、バックアップはあるとうれしいものです。git のリモートリポジトリが破損した場合などに復元元を探すために、誰が持っているのが最新のリビジョンで、、というような作業が発生することは避けたいからです。

git のリモートリポジトリから別のサーバにバックアップを作成するのは、hooks を利用することで簡単に設定できます。例えば、対象となるリポジトリの post-receive で下記のようなコマンドを設定しておくとできます。

  • バックアップ先のサーバ:ディレクトリは targethost.example.jp:/var/lib/git
  • バックアップのための SSH 接続で利用するユーザは syncuser
  • gitosis ユーザは syncuser 権限で git コマンドが利用出来るように visudo を設定
1
2
3
4
5
6
7
8
#!/bin/sh
#####
# hooks/post-receive
#####

MIRROR_HOST='targethost.example.jp'
REPO_NAME=`pwd | perl -e '$t=<stdin>;$t=~ s!^.*/!!;print $t'`
sudo -u syncuser -H git push :mirror syncuser@${MIRROR_HOST}:/var/lib/git/${REPO_NAME}

":mirror" オプションを付けることで、バックアップ先にも bare のままディレクトリが作成されます。 リモートリポジトリとして利用するサーバと別のサーバで Redmine や Trac、あるいは gitweb などを動作させてリポジトリブラウザを利用する場合などでも bare を付けます。

hooks/post-receive は、リポジトリに加わる変更を受信したタイミングで実行される hook script です。cron などで仕込むものとは異なり、push されたタイミングで sync されるので無駄にコネクションが張られることがありません。 ただし、push するタイミングで別サーバへの push が実行されるため、ユーザからみると push 自体の時間が少し長くなるのが欠点です。