プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Git+DropBoxで、プライベートリポジトリ作成。或いはGitをAmazon S3でバックアップ

 2年程前に書いたSubversion+DropBoxの焼き直しです。今風にGitで書きなおして見ました。後は、同期だけでは心許無いので、バックアップ戦略について考えてみました。


まず解決したい問題は、下記の3つです。2年前から変わっていませんね。

  1. ソースのバックアップをどこか違うところに持ちたい
  2. ネットワークがオフラインの時でも、コミット出来るようにしたい
  3. 違う環境から作業しても、最新のソースを取れるようにしたい


 まず1のソースのバックアップについてです。厳密にはバックアップではなく、同期で実現しています。開発機単体ではなくDropBoxにコピーされるので物理的障害等に対する対策は充分です。一方でDropBoxの特性として、DropBox上に置いているリポジトリを消してしまうと、消された状態で同期されてしまいます。DropBox上のリポジトリと、ローカルのワーキング・リポジトリに分ければ問題はなくなります。保険の為にAmazon S3にバックアップも設定する方法も、併せて紹介したいと思います。
 次に2のネットワークがオフラインの時でもコミットしたいという点ですが、実はGitを採用している時点で実現できています。GitにDropBoxを併用することで、3の違う環境から作業しても最新のソースを取れるようにしたいを実現出来ます。それでは、具体的な手順を見て行きましょう

DropBoxの準備



 何はさておき、DropBoxのアカウントが必要です。まだアカウントを持っていない方は、この招待コードから開設して頂けたら通常で開設するより、+500MBの容量をゲット出来ます。(私のアカウントも+500MBになりますので、宜しければお願いします。)
 アカウント開設したら、Windows,Macそれぞれの手順に従ってDropBoxアプリをインストールしてください。あまり難しくないのと、バージョンごとにUI等の見た目が変わるので、手順は割愛します。

DropBox上にリポジトリの作成



 Macを想定してのコマンドです。Windowsの方は、適当にコマンド置き換えてください。
ポイントとしてはリポジトリの作成時にbareオプションを指定して、DropBox上のGitリポジトリにはGitの管理情報のみを作成するようにします。

cd ~/Dropbox/
mkdir git
mkdir git/project1
cd git/project1
git --bare init --shared=true

DropBoxからクローンして、ローカルで開発する



 プログラミング等の作業用ディレクトリは、DropBox以外のローカルディスク上につくります。

cd ~/projects
git clone ~/Dropbox/project1

 後は、通常のGitの使い方と同じです。

cd ~/projects/project1
〜プロジェクトのファイル等作成〜
git add .
git commit -m"最初のコミット"
git push origin master

 逆に、XCode等でローカルのGitリポジトリが既にある場合は、次のように追加します。

git remote add origin ~/Dropbox/git/project1/
git push origin master

共有してチームで使う



 またDropBoxの共有機能を利用することにより、GitHubのTeam共有的なことも出来ます。やり方は簡単で、DropBoxのWeb管理画面から該当のリポジトリを共有するだけです。そうすると、任意の相手を招待できます。共有した後の手順は、先ほどの手順と同じです。なんちゃって共有リポジトリの出来上がりです。

 注意点としては、同時にgit pushするとコンフリクトの恐れがあります。シビアな使い方をする場合は、GitHubのPrivateリポジトリを使うか、正規のGitサーバを用意しましょう。

Amazon S3を使ったバックアップの戦略



 最後に、DropBox領域のバックアップです。DropBoxの内部構造的には、Amazon S3のストレージを使っているので論理上の堅牢性はAmazon S3と同等の99.999999999%と9が11個並ぶレベルです。一方で、DropBox社や自分自身の問題でデータを消失する可能性は、一定の確率であると考えるべきです。その為のバックアップです。バックアップ先はどこでも良いと思うのですが、やはりクラウドのストレージにバックアップするのが便利で良いです。
 アーキテクチャ的に考えるとAmazon以外のクラウドにバックアップするのが本来良いのですが、私はAWS一押しなのでAmazon S3にバックアップします。単純にDropBoxの領域とS3を同期するだけでは全く意味が無いので、どうバックアップするか考える必要があります。
 まず防ぎたい事態とはDropBoxのGitのフォルダを間違えて消してしまい、それがそのまま消された状態で同期されることです。対策としては2つ考えられます。1つ目は、DropBoxの領域を定期的にバックアップして何世代か持つことです。誤って消してしまったとしても、世代が残っている間に気がつけば復元できます。問題は、何世代持つか。またバックアップの間隔をどうするか。間隔を長くすれば、その間に気づく可能性が高くなります。一方で前回バックアップからの差分が取りこぼされる恐れがあります。対策としては、間隔を短く世代数を多くすることです。ストレージ料が掛かる以外は、問題は少ないように見えます。
 一方でバックアップ間隔を短くしても、その間でバックアップ漏れが起こる可能性は否定できません。漏れを無くすにはgitのpush時にS3に対する同期コマンドを発行すれば良いのです。先ほど同期は意味がないと言いましたが、Gitコマンドをトリガーとする同期であれば、人的ミスによるリポジトリ消失を防ぐことが出来ます。
 また全く別の方法として、S3自体にリポジトリを置くという方法があります。JGitを使えば実現できますが、クライアント側の制約がある程度つきます。これについても、また機会を改めて紹介したいと思います。

GitのHookコマンドによる同時の実行



 Gitには、各種のフックが用意されています。主にクライアント側とサーバー側のフックの2種類があります。今回はサーバ側のフックであるpost-updateで実行します。これはgit pushが実行された後に実施されます。ここに同期プログラムを仕込めばよいです。S3への同期はs3syncもしくはs3cmdで可能です。この辺りにまとめてるので、参照してください。

まとめ



 DropBox+○○という組み合わせは、今では色々と出ています。これはDropBoxの単純性+手軽さが優れている点だと思います。一方でDropBoxだけでは解決出来ない問題は、他のサービスと組み合わせを試してみてください。効果抜群になるケースも沢山ありますよ。


See Also:
週末プログラマにお薦め!!Subversion+DropBoxで似非分散型バージョン管理
StatSVNのGit版 GitStatsを使ってみる
XcodeでGitのリモートリポジトリ(remote repository)を追加する方法
Amazon EC2からS3にバックアップする為のS3Sync
Markdown記法+Git+md2review+ReVIEWで原稿・ドキュメント管理


参照:
Git 7.3 Git のカスタマイズ - Git フック