Wikipedia explica la detección automática de cambio de nombre:
Brevemente, dado un archivo en la revisión N, un archivo del mismo nombre en la revisión N-1 es su antecesor predeterminado. Sin embargo, cuando no hay un archivo con el mismo nombre en la revisión N − 1, Git busca un archivo que existía solo en la revisión N − 1 y es muy similar al nuevo archivo.
La detección de cambio de nombre aparentemente se reduce a una detección de archivos similar. ¿Ese algoritmo está documentado en alguna parte? Sería bueno saber qué tipo de transformaciones se detectan automáticamente.
Respuestas:
Git rastrea el contenido de los archivos, no los nombres de los archivos. Así que cambiar el nombre de un archivo sin cambiar su contenido es fácil de detectar para git. (Git no rastrea, pero realiza la detección ; usar
git mv
ogit rm
ygit add
es efectivamente lo mismo).Cuando se agrega un archivo al repositorio, el nombre del archivo está en el objeto de árbol. El contenido real del archivo se agrega como un objeto binario grande ( blob ) en el repositorio. Git no agregará otro blob para archivos adicionales que contengan el mismo contenido. De hecho, Git no puede, ya que el contenido se almacena en el sistema de archivos, siendo los dos primeros caracteres del hash el nombre del directorio y el resto el nombre del archivo dentro de él. Entonces, detectar cambios de nombre es una cuestión de comparar hashes.
Para detectar pequeños cambios en un archivo renombrado, Git usa ciertos algoritmos y un límite de umbral para ver si se trata de un cambio de nombre. Por ejemplo, eche un vistazo a la
-M
bandera degit diff
. También hay valores de configuración comomerge.renameLimit
(el número de archivos a considerar al realizar la detección de cambio de nombre durante una fusión).Para comprender cómo trata git archivos similares (es decir, qué transformaciones de archivo se consideran cambios de nombre), explore las opciones de configuración y los indicadores disponibles, como se mencionó anteriormente. No necesita ser considerado con el cómo. Para comprender cómo git realmente realiza estas tareas, observe los algoritmos para encontrar diferencias en el texto y lea el código fuente de git.
Los algoritmos se aplican solo con fines de diferenciación, combinación y registro; no afectan la forma en que git los almacena. Cualquier pequeño cambio en el contenido del archivo significa que se le agrega un nuevo objeto. No hay delta o diferencia en ese nivel. Por supuesto, más adelante, los objetos pueden empaquetarse donde los deltas se almacenan en archivos de paquete, pero eso no está relacionado con la detección de cambio de nombre.
fuente
Hay muchos algoritmos que detectan similitudes entre textos y los sistemas de control de versiones a menudo los usan para almacenar solo la diferencia entre dos versiones. Herramientas como WinMerge son lo suficientemente inteligentes como para detectar diferencias, incluso dentro de las líneas, por lo que no veo una razón por la que estos algoritmos no se usarían para esta detección de cambio de nombre.
Aquí hay una discusión sobre algoritmos para detectar textos similares . Algunos de estos algoritmos pueden estar optimizados para lenguajes naturales, mientras que otros pueden funcionar mejor para el código fuente, pero en esencia son muy parecidos.
fuente