git-media をインストールして使ってみます。Windows 環境にインストールして使っている事例がなかったのでちょっと手間取りました。
git-mediaとは
git-media とは巨大なバイナリファイルの扱いが苦手とされる git の拡張として作られたプラグインです。巨大なファイルにおいて、通常の git リポジトリに対してはファイルのハッシュ値を記録して、巨大なファイルの扱いに長けた別の場所にそのファイル実体を上げることが出来るようになります。
こういった git のプラグインは他にもあって git annex とか有名(らしい)です。また最近の git には LFS( Large File Storage ) の拡張も出始めているので実は本内容はそのうち不要なものとなるかもしれません。
インストール
git-media では ruby スクリプトが使われているため、まずは Windows に Ruby を使えるようにするところからスタートです。
ここでは Ruby Installer (http://rubyinstaller.org/) を利用させてもらうことにしました。ここから 2.2.2 (32bit) を使用することにしました。32bit の理由は git 側が 32bit だったからです。
このインストール過程では、 Ruby への実行ファイルへの環境変数 PATH を設定し、空白を含まないフォルダへインストールすることにしました。
続いて Git Bash を開いて適当なディレクトリで、以下のコマンドで git-media を取得してきます。そしていくつかのコマンドを実行します。
$ git clone https://github.com/alebedev/git-media.git
$ cd git-media
$ gem install bundler
$ gem install trollop
$ bundle install
$ gem build git-media.gemspec
うまくいくと、 git-media の gem が出来ているのでインストールを行います。
$ gem install git-media-0.1.5.gem
Successfully installed git-media-0.1.5
Parsing documentation for git-media-0.1.5
Installing ri documentation for git-media-0.1.5
Done installing documentation for git-media after 0 seconds
1 gem installed
環境変数PATH に、git-media/bin の場所を追加しておきます。
そしてgit の設定を変更します。
$ git config --global filter.media.clean 'git-media filter-clean'
$ git config --global filter.media.smudge 'git-media filter-smudge'
動作確認
早速適当なリポジトリを用意してテストしてみたいと思います。ここでは checkBigFile なるリポジトリを作成してみました。
リポジトリを作成したら、設定を変更します。この設定はリポジトリごとに行います。以下のような設定を行い、 iso ファイルは今回の git-media 拡張が適用されるような感じにしています。
$ echo “*.iso filter=media -crlf” > .gitattributes
.git フォルダ内の config ファイルを開いて以下の項目を追加しておきます。ここでは適当にローカルの Dドライブに巨大ファイルが配置されるような設定を行っています。適宜変更して下さい。
[git-media]
transport=local
autodownload= false
localpath = d:/temp/
ここで iso ファイルを追加して、 commit を行います。すると以下のようなログが出てきます。
[master 0ced4ec] add iso
Saving media : 3f71cc359627b1ecbd1cb4a370f0de5291143f11 : 0.045
1 file changed, 1 insertion(+)
create mode 100644 temp.iso
このとき、isoファイルは .git フォルダ内にある media フォルダ以下をたどるとハッシュ化された状態で発見することができます。
このフォルダが出来ていなかったり、ファイルが存在しない場合には、 git-media がうまく適用されていないので、手順を再確認してみて下さい。
プッシュしてみる
適当なリモートを用意してみて、今回の内容を Push してみます。今回は適当にローカルにたててある GitBucket に送り込んでみました。
その結果以下のような状態になっていました。一見普通の状態と変わらないようです。
しかし、この iso ファイルをクリックして確認してみると以下のようになっていました。iso ファイルのハッシュだけが記録されていました。
もちろんリモートリポジトリに対してこの状態であるだけで、ローカルにあるファイルではちゃんと大きな iso ファイルが残っています。
ここで巨大なファイルについてのリモートについて考えてみます。通常の Push では上がらないので、コマンドを実行する必要があります。
ちょっと確認のために余計なコマンドもありますが、以下のようにして巨大なバイナリもリモート(としている部分)に上げることができます。
$ git media status
== Expanded Media ==
(5m) temp.iso
== Unpushed Media ==
(5m) 3f71cc35
$ git media sync
Updated git index
Uploading 3f71cc35 1 of 1
必要な処理は git media sync で、これによって最初に設定したファイル置き場部分にデータが配置されます。
ここでは D:\temp だったのでそこをのぞいてみると、 3f71cc35 から始まるファイルが存在していると思います。
まとめ
とりあえず通常のソースコードなどと巨大ファイル群の置き場を分離することが出来ることを確認できました。次回にはもう少しこれを使ってみての内容を記載できたらと思います。