2012-11-15 6 views
5

İkili dosyalarla gitme işlemi sırasında, bir dosyayı başka bir değiştirmeyi, değiştirmeyi ve yeniden adlandırmayı düşünebilirsiniz. Bu, örn. foo-1.0.3.jar ile veya aşağıdaki test-vaka ile foo-1.0.1.jar değiştirirken:Git-durumu neden yeni bir ada sahip bir güncellenmiş ikili dosyayı yeniden adlandırmak gösteriyor?

$ 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 

Şimdi açıkça yeni içerikler (en azından kısmen) ve yeni bir adla bir dosya var .

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: test.dat -> test2.dat 
  • Bunun nedeni nedir, mesela: Ancak, git bu bir yeniden adlandırma git status içinde gördüğü Bu iki dosya nasıl olmalı? Test2.dat tamamen farklı veriler içeriyorsa, öyle görünmüyor.
  • Biraz garip görünmek dışında herhangi bir dezavantajı var mı? Gerçek veriler mükemmel görünüyor; Önceki revizyonu kontrol ederken, bu rev ​​için doğru dosyayı alırım.

cevap

4

Git, aslında adlarını depolamıyor, yalnızca bir dosya silinen yeni bir ağaç saklıyor ve başka bir tane ekledi. Ağaçları karşılaştıran Git komutları (git diff, git log, git status) içeriğe göre yeniden adlar algılar.

Bazı nedenlerden dolayı dosyalarınız için yeniden adlandırma algılaması tetikleniyor. Belki de /dev/urandom'da entropiyi tükettiyseniz içerikleri benzerdir?

Düzenleme: Bakınız örn. Yeniden adlandırma algılama hakkında ayrıntılar için How does git detect similar files, for its rename detection?.

+0

Hayır, ikili dosyalar ile her zaman başarılı olmaz. test.dat, test2.dat olarak yeniden adlandırıldı ve yeni içeriğe eklendi. Git, yeniden adlandırıldığından (ve güncellendiğinden) yeniden adlandırıldığını söylüyor. – jamessan

+1

@jamessan: git 'mv' ve afaik kullandığını bilmiyorum inode sayılarını kontrol etmiyor. Bu git isimleri saklamıyor olsa da doğru. – ThiefMaster

+0

Oh, doğru değil, 'notrunc' dikkat etmedi! – opqdonut