Amazon S3をjgitでgitリポジトリとして活用する

ふとした興味からAmazon S3をgitリポジトリにできないかと調べてみたところ、ピュアJavaのgitの実装JGitを使えば可能だということがわかりました。普通はgithub.comとかで事足りると思いますが、「gitリポジトリを信頼できる場所にバックアップしておきたい!」というような場合に利用できるかも知れません。以下の作業で動作は確認していますが、JGit + Amazon S3が本格的に使い物になるのかは未検証です。

JGitのインストール

JGitのCLIをインストールします。JGitはEclipseプラグインのEGitに含まれているので、まずEGitのgitリポジトリからEGitを取ってきます。

git clone git://repo.or.cz/egit.git

egit直下にあるmake_jgit.shを実行してJGitのバイナリを作ります。

cd egit
./make_jgit.sh

動作確認でバージョンを表示させてみます(僕が試した時点のmasterはv0.4.0.129でした)。

./jgit version

jgitでAmazon S3をgitリポジトリとして使う

設定ファイルの作成

ホームディレクトリに適当な名前(.jgit_s3とか)で以下のようにAWSのアクセスキーとシークレットキーを書いたファイルを作ります。もしHTTPで公開しないならaclはpublicではなくprivateにします。

accesskey: AWSAccessKey
secretkey: AWSSecretKey
acl: public
Amazon S3へのpush

jgitの独自拡張でamazon-s3://をつけてAmazon S3にアクセスできます。次のコマンドはバケットYOURBACKETの/projects/foobar.git以下のオブジェクトとしてgitリポジトリをpushする例です。

jgit push amazon-s3://.jgit_s3@YOURBACKET/projects/foobar.git refs/heads/master
Amazon S3からのpull

設定ファイルでaclをpublicにしてpushしていればHTTPで公開されるので、普通にgitを使ってpullできます。

git pull http://YOURBACKET.s3.amazonaws.com/projects/foobar.git

jgitでAmazon S3を直接叩くこともできますが、jgit pullはできないのでfetch/mergeするしかないようです。

jgit fetch amazon-s3://.jgit_s3@YOURBACKET/projects/foobar.git
git merge s3/master