git-media を使ってみてちょっと妙な現象に出遭いました。
結論から言えば、コミット済みの未編集なバイナリファイルが変化してしまっているという状態です。
これについて、何が起こってしまったのかをちょっと調査してみた話を以下に記録しておきます。
環境について
自分が試している環境は Windows7 の環境で、msysgit を用いています。 cygwin の git ではないです。また Git Bash もしくは tortoiseGit で操作を行っています。これらのバージョンは以下の通りです。
- TortoiseGit 1.8.14.0
- git version 1.9.5.msysgit.0
また使用した Ruby は、RubyInstaller でインストールした以下の2つのバージョンで試してみました。
- 1.9.3
- 2.2.0
Ruby 1.9.3 では素直に git-media がインストールできなかったので、以下のようにして手動で gem をインストールしました。
gem install log4r -v '1.1.10' gem install mini_portile -v '0.6.0' gem install nokogiri -v '1.6.3.1' gem install netrc -v '0.8.0' gem install proxies -v '0.2.1' gem install right_http_connection -v '1.5.0' gem install right_aws -v '3.1.0' gem install ruby-hmac -v '0.4.0' gem install s3 -v '0.3.21' gem install ruby-atmos-pure -v '1.0.5' gem install trollop -v '2.0'
結果からいえば、 Ruby のバージョンは無関係であるようでしたが・・・。
テスト
まずは Windows 環境なので autocrlf, safecrlf らの設定を false となるように設定しました。そして以下のような内容を config に記載しています。
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true hideDotFiles = dotGitOnly autocrlf = false safecrlf = false [git-media] transport=local autodownload= true localpath = d:/temp/ [filter "media"] clean = git-media filter-clean smudge = git-media filter-smudge
あと、 .gitattributes には以下のように iso ファイルをバイナリとして扱う設定にしています。
*.iso filter=media -crlf
この状態で、適当な iso ファイルを追加してみました。その時の SHA1 ハッシュをそれぞれ出してみたのですが、以下のような感じの結果となりました。
$ git add test.iso Saving media : 2a6b7c6c59634a1373855cd47abb5c41e027140c : 0.058994 $ openssl sha1 test.iso SHA1(test.iso)= 2a6b7c6c59634a1373855cd47abb5c41e027140c $ git media sync $ git media status == Already Pushed Media == (7m) 2a6b7c6c $ openssl sha1 test.iso SHA1(test.iso)= 2a6b7c6c59634a1373855cd47abb5c41e027140c $ git media clear Removing 2a6b7c6c $ git commit -m 'add test.iso' [master e4f604a] test.isio Saving media : 2a6b7c6c59634a1373855cd47abb5c41e027140c : 0.061 1 file changed, 1 insertion(+) create mode 100644 test.iso $ opensshl sha1 test.iso SHA1(test.iso)= 2a6b7c6c59634a1373855cd47abb5c41e027140c
とりあえずこの時点では問題なさそうです。
test.iso ファイルを削除して、その後以下のようにして復帰させてみます。(ファイルの削除はエクスプローラーで削除しました。その後の操作を以下のように Git Bash にて行っています)
$ git status On branch master Changes not staged for commit: (use "git add/rm..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) deleted: test.iso $ git checkout -- test.iso Recovering media : 2a6b7c6c59634a1373855cd47abb5c41e027140c $ openssl sha1 test.iso SHA1(test.iso)= ddb3f64f9ad602e01758f75581c886bd3d9ffa2b
ここで中身が狂ったようです。実際に中身を前後で比較してみたら例の改行コードあたりでデータの食い違いが起こるようでした。今回はシンプルな再現ケースが見つかったのでこれだけを紹介しましたが、使い始めたときにはブランチの切り替えやリベースなど、どこかで破壊されたようだという点で気付いたので結構大変でした。
ちょっとこのままでは使えないので、巨大ファイルについては別の解法を探ってみたいと思います。