git-media の状態がまずかったので、似たようなソリューションを探してみたところ git-fat というものが見つかりました。これは git-media からフォークして作成したもののようです。言語が Ruby から Python へと変化していましたが。
今回は Windows 環境にてこの git-fat をインストールして動作を確認するところまでやってみます。
インストール
git-fat は Python 2.x 系を必要とするようです。そのためまずは Python をインストールします。今回 Windows のインストーラー付きの Python は 2.7.10 を使用しました。インストールした Python にはパスが通っていることとします。
その後、コンソールで以下のコマンドで git-fat をインストールすることが出来ます。
$ pip install git-fat
既にパッケージ化されているようでインストールは非常に簡単です。
設定
git fat を使用するためには、各リポジトリでの .gitattributes 作成が必要です。
リポジトリに .gitattributes というファイルを作成し、ここにバイナリファイルとして扱う対象とするファイルの拡張子を設定します。以下の例では iso ファイルを git-fat 経由となるように設定しています。
*.iso filter=fat -crlf
最後に、 .gitfat というファイルを作成します。ここにバイナリファイルをどこに転送するかという情報を記録します。公式ページでの例を引用すると以下のようになっています。
[rsync] remote = storage.example.com:/path/to/store user = git port = 2222 [http] remote = http://storage.example.com/store
今回の実験では、 D:\temp に配置されるようにしたかったので、以下の内容でファイルを作成しています。また今回はテストのため、匿名の clone を考慮していません。そのため [http] の項目を記載していません。
[rsync] remote= //localhost/d$/temp/
リポジトリ作成
以下のようにしてリポジトリを作成します。通常の初期化に比べて1手間が増えています。 git fat init は config に fat のためのフィルタ適用のエントリを追加する処理となっています。
$ mkdir testGitFat; cd testGitFat $ git init $ git fat init Setting filters in .git/config Creating .git/fat/objects Initialized git-fat ## 上記で説明した .gitattributes, .gitfat をコピーしておく. $ git add .gitattributes $ git add. gitfat $ git commit -m 'initial'
使い方
バイナリとして扱うファイル拡張子は iso としたので、まずは適当に iso ファイルを追加してみます。追加の仕方は通常の git 操作と同じ処理で OK です。その後に commit します。これも通常の git 操作と変わりないです。
$ git add test.iso $ git commit -m 'add iso' [master 0353d79] add test.iso 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.iso
この状態を git-fat がどう管理しているかを確認してみます。
$ git fat list 2a6b7c6c59634a1373855cd47abb5c41e027140c test.iso $ git fat status (何も出ない)
通常であれば Push をするところですが、巨大ファイル用の相当機能として、git fat push というものがあるようなので実行してみます。これは .gitfat で指定した場所へファイルをアップロードするコマンドとなるようです。
$ git fat push building file list ... 1 file to consider 2a6b7c6c59634a1373855cd47abb5c41e027140c 7557120 100% 3.50MB/s 0:00:02 (xfer#1, to-check=0/1) sent 7558144 bytes received 31 bytes 3023270.00 bytes/sec total size is 7557120 speedup is 1.00
これで指定した場所に、バイナリファイルが転送されました。今回の例だと D:\temp にファイルが生成されました。
別のファイルをさらに追加してみます。
$ git add test2.iso $ git commit -m 'add test2.iso' [master 77772ff] add test2.iso 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test2.iso $ git fat push
ファイルを削除して、元に戻すコマンドを試してみます。削除はエクスプローラーで削除しました。
$ git checkout -- test.iso $ git checkout -- test2.iso
結果が何も表示はありませんでしたが、ファイルは正常に復元されました。削除前後で念のため、 SHA1 ハッシュを求めておきましたが、 2 ファイルとも一致しました。
まとめと感想
git-media ほどは情報を出さないようですが、正常に機能していると思います。使い方としては git push する際に、git fat push さえしておけばよさそうです。あとはたまに git fat pull で取得する感じですかね。ただ git-media のほうがバイナリファイルを配置する先の設定が色々と出来るようなので使い勝手がよさそうに見えます。今回は都合よくローカルの別ディレクトリへファイルを配置することが出来てよかったですが、一見出来ないかと思いました。今回の例を見る限りではファイルパスの指定で UNC パスを設定すれば、ファイル共有先に配置することも出来そうです。
しかし、転送プロトコルは rsync(+ssh) ぽいので、 Linux サーバーだったりすると rync が動いている必要はありそうです。git-media では scp が使えたりとかするみたいだったので、転送に関してはあちらが一歩先の実装をしていますね。
補足
環境変数 GIT_FAT_VERBOSE=1 とすれば、より詳細なログを出力するっぽいです。