2012-11-15 9 views
5

Quando si ha a che fare con file binari git sembra prendere in considerazione la possibilità di sostituire un file con un altro, modificare, rinominare un file. Questo accade ad es. in caso di sostituzione foo-1.0.1.jar con foo-1.0.3.jar o con il seguente test-case:Perché git-status mostra un file binario aggiornato con un nuovo nome come un nuovo nome?

$ 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 

Ora ho chiaramente un file con nuovi contenuti (almeno in parte) e un nuovo nome . Tuttavia, git considera questo una ridenominazione in git status:

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: test.dat -> test2.dat 
  • Qual è la ragione di questo, per esempio quanto devono essere simili questi due file? Non sembra accadere se test2.dat contiene dati completamente diversi.
  • Ha qualche svantaggio tranne l'aspetto un po 'imbarazzante? I dati reali sembrano essere perfettamente soddisfacenti; quando controllo la revisione precedente, ottengo il file corretto per quel rev.

risposta

4

Git in realtà non memorizza i nomi, solo memorizza un nuovo albero con un file eliminato e un altro aggiunto. I comandi Git che confrontano gli alberi (git diff, git log, git status) rilevano i nomi in base al contenuto.

Per qualche motivo, il rilevamento della ridenominazione si attiva per i file. Forse il loro contenuto è simile se hai esaurito l'entropia in /dev/urandom?

Modifica: vedere ad es. How does git detect similar files, for its rename detection? per dettagli sul rilevamento della rinomina.

+0

No, non ha sempre esito positivo con i file binari. test.dat è stato rinominato in test2.dat e quindi ha aggiunto un nuovo contenuto. Git dice che è stato rinominato perché, beh, è ​​stato rinominato (e aggiornato). – jamessan

+1

@jamessan: git non può sapere che ho usato 'mv' e afaik non controlla i numeri di inode. Tuttavia, quel git non memorizza i nomi è corretto. – ThiefMaster

+0

Oh, giusto, non ho notato il 'notrunc'! – opqdonut

Problemi correlati