本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

git-media を使ってみる (3)

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

ここで中身が狂ったようです。実際に中身を前後で比較してみたら例の改行コードあたりでデータの食い違いが起こるようでした。今回はシンプルな再現ケースが見つかったのでこれだけを紹介しましたが、使い始めたときにはブランチの切り替えやリベースなど、どこかで破壊されたようだという点で気付いたので結構大変でした。
 ちょっとこのままでは使えないので、巨大ファイルについては別の解法を探ってみたいと思います。

サーバー構築プログラミング
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました