5

バイナリファイルを処理する場合、gitはファイルを別の変更されたファイルに置き換えて名前を変更することを検討しているようです。これは、たとえばfoo-1.0.1.jarをfoo-1.0.3.jarに置き換える場合、または次のテストケースに置き換える場合に発生します。

$ 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はこれを次の名前変更と見なしますgit status

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    test.dat -> test2.dat
  • この理由は何ですか。たとえば、これら2つのファイルはどの程度類似している必要がありますか。test2.datに完全に異なるデータが含まれている場合は発生しないようです。
  • 少しぎこちなく見える以外に不利な点はありますか?実際のデータは完全に問題ないようです。以前のリビジョンをチェックアウトすると、そのリビジョンの正しいファイルが取得されます。
4

1 に答える 1

4

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

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

編集: たとえば、名前変更の検出については、git は類似のファイルをどのように検出しますか? を参照してください。名前変更の検出の詳細については、

于 2012-11-15T17:10:43.060 に答える