¿Por qué git-status muestra un file binary actualizado con un nuevo nombre como rename?

Cuando se trata de files binarys, git parece considerar replace un file por otro, modificado, presentar un cambio de nombre. Esto sucede, por ejemplo, al replace foo-1.0.1.jar con foo-1.0.3.jar o con el siguiente caso de testing:

$ 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 

Ahora claramente tengo un file con nuevos contenidos (al less parcialmente) y un nuevo nombre. Sin embargo, git considera que esto es un cambio de nombre en git status :

 $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: test.dat -> test2.dat 
  • ¿Cuál es la razón de esto, por ejemplo, qué tan similares deben ser esos dos files? No parece suceder si test2.dat contiene datos completamente diferentes.
  • ¿Tiene alguna desventaja, excepto que parece un tanto incómodo? Los datos reales parecen estar perfectamente bien; Cuando reviso la revisión anterior, obtengo el file correcto para esa revisión.

Git en realidad no almacena los cambios de nombre, solo almacena un nuevo tree con un file eliminado y otro agregado. Los commands de Git que comparan treees ( git diff , git log , git status ) detectan los cambios de nombre según el contenido.

Por alguna razón, la detección de cambio de nombre dispara para sus files. ¿Quizás sus contenidos sean similares si has agotado la entropía en /dev/urandom ?

Editar: ver, por ejemplo, ¿cómo detecta Git files similares para su detección de cambio de nombre? para get detalles sobre la detección de cambio de nombre.