svnの方が好きだけどgitもいいかも

ソースコードのバージョン管理はcvsから使い始めて、
今ではsvnを利用しています。というか未だにsvnを利用しています。
最近の流行は明らかにgitですけどね。
gitの出始めはクライアント、特にWindows環境からのアクセスにいろいろ問題がありましたが、
もはやそれも過去の話でgitを使うのに大きな制限はありません。
強いてあげればプロキシがらみでしょうか。

さて、私はgitよりもsvnのほうが好きで、もちろんsvnにも使いにくさもあるのですが、
私の用途ではそもそも中央集権のほうが使いやすかったりするので、
サーバにはsvnを使っています。
gitは必要なときにクライアントオンリーで使っています。

ところが最近この考えが変わってきました。
きっかけはServersma@VPS LABに当選したことです。
これで自由にいたぶれるVPSが2台になりました。
まあLABは期間限定のベータサービスなのですが、
これだけVPSのコストが下がると複数台借りるのは現実的ですし、
バージョン管理サーバも複数台で分散管理というより
1台をマスターにしてを他をバックアップにするというのも選択としてありです。
codebreakなる無料で無制限なgitサーバサービスも登場しており、
これとVPSとを組み合わせるようなこともできるかもしれません。
もちろんsvnだってサーバにあるリポジトリのディレクトリを丸ごとコピーするとか、
“svnadmin dump”コマンドでバックアップし”svnadmin load”コマンドでリストアすることもできますが、
gitほど手軽ではありません。

ということでgitサーバを立ててみます。
作業はServersMan@VPS(debian-32bit)とServersma@VPS LAB(ubuntuー64bit)で同じです。
まずは以下を実行します。

$ su -
# apt-get install git-core
# apt-get install git-daemon-run

次に設定ファイル”/etc/sv/git-daemon/run”の最後の行

--base-path=/var/cache /var/cache/git

--base-path=/var/repos --export-all --enable=receive-pack

に変更して以下を実行します。

# mkdir /var/repos
# sv restart git-daemon

リポジトリ(ここでは名前を”sandbox”とする)を作成するには以下を実行します。

# mkdir -p /var/repos/sandbox.git
# cd /var/repos/sandbox.git
# git init --bare --shared
# chown -R gitdaemon .

このリポジトリにとりあえずファイル”README”を登録するには同一マシンから以下を実行します。

$ cd ~
$ mkdir sandbox
$ cd sandbox
$ git init
$ git config user.email "<メールアドレス>"
$ git config user.name "<ユーザ名>"
$ echo 1 > README
$ git add README
$ git commit -m 'Created.'
$ git remote add origin git://localhost/sandbox.git
$ git push origin master

この状態で同一マシンから

$ cd ~
$ mkdir sandbox1
$ cd sandbox1
$ git clone git://localhost/sandbox.git .
$ cat README

を実行すると、確かに”README”が登録されていることがわかります。
もちろん別のマシンからもgitサーバにアクセスでき以下を実行すれば確認できます。

$ cd ~
$ mkdir sandbox
$ cd sandbox
$ git clone git://<サーバ名>/sandbox.git .
$ cat README

それではマスターサーバのリポジトリの内容をバックアップサーバにコピーしてみましょう。
バックアップサーバから以下を実行するだけです。

# cd /var/repos/
# git clone --mirror git://<マスターサーバ名>/sandbox.git .
# chown -R gitdaemon .

以後は定期的に以下を実行して同期するようにします。

# cd /var/repos/sandbox.git
# git fetch --all
# chown -R gitdaemon .

こうしておけばバックアップサーバでもリポジトリが管理できるようになります。
万一マスターサーバが壊れたら、バックアップサーバをマスターサーバにして運用可能です。
ただし、マスターサーバとバックアップサーバに好き勝手にpushすると
あとで内容を同期するのが面倒になる可能性があるのでやめておきましょう。
もしかするとDBM並みにレプリケーションもできるかもしれませんが。