2012-11-15 7 views
5

バイナリファイルを扱うときには、ファイルを別のファイルに置き換え、名前を変更してファイル名を変更することを検討しているようです。これは、例えば起こる。 FOO-1.0.3.jarとするか、次のテストケースとFOO-1.0.1.jarを交換する場合:なぜgit-statusは、名前が変更された新しいバイナリファイルを表示するのですか?

$ dd if=/dev/urandom of=test.dat bs=1024 count=10 
$ md5sum test.dat 
8073aef704e9df13b44818371ebbcc0b test.dat 
$ git add test.dat && git commit -m 'add binary file' 
$ mv test.dat test2.dat 
$ git rm test.dat 
$ dd if=/dev/urandom of=test2.dat bs=1 count=1 conv=notrunc 
$ md5sum test2.dat 
21e1ac3ab9ba50c9dad9171f9de7232d test2.dat 
$ git add test2.dat 

今、私は明らかに新しい内容(少なくとも部分的に)して、新しい名前のファイルを持っています。

例えば、その理由は何
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: test.dat -> test2.dat 
  • :しかし、Gitはgit statusでこの名前の変更を検討しますこれらの2つのファイルはどれくらい似ている必要がありますか? test2.datに完全に異なるデータが含まれているとは思われません。
  • 多少不自然に見える以外は何らかの欠点がありますか?実際のデータは完全にうまくいくようです。以前のリビジョンをチェックアウトすると、そのリビジョンの正しいファイルが取得されます。

答えて

4

Gitは実際に名前を保存するわけではなく、1つのファイルが削除され、もう1つが追加された新しいツリーを保存するだけです。ツリーを比較するGitコマンド(git diffgit loggit status)は、コンテンツに基づいて名前の変更を検出します。

何らかの理由でファイルの名前の変更が検出されます。 /dev/urandomでエントロピーを使い果たした場合、その内容は似ていますか?

編集:名前の変更の検出の詳細については、How does git detect similar files, for its rename detection?を参照してください。

+0

いいえ、バイナリファイルでは必ずしも成功するとは限りません。 test.datの名前がtest2.datに変更され、新しいコンテンツが追加されました。 Gitは名前が変更されたと言っています。なぜなら、名前が変更されて更新されたからです。 – jamessan

+1

@jamessan:gitは私が 'mv'を使ったことを知りませんし、afaikはiノード番号をチェックしません。そのgitは名前の変更を保存しませんが、正しいです。 – ThiefMaster

+0

ああ、私は 'notrunc'に気付かなかった! – opqdonut

関連する問題