Soy relativamente nuevo en git, utilicé Subversion antes.
Noté que la mayoría de los front-end gráficos de git y los complementos IDE no parecen ser capaces de mostrar el historial de un archivo si el archivo ha sido renombrado. Cuando uso
git log --follow
en la línea de comando, puedo ver todo el registro a través de los nuevos nombres.
Según Linus Torvalds, el interruptor --follow es un deleite "novato SVN", los usuarios serios de git no lo usan:
--follow es un truco total, destinado a satisfacer a los ex usuarios de SVN que nunca supieron nada sobre cosas como la paternidad o buenos gráficos de revisión de todos modos.
No es totalmente fundamental, pero la implementación actual de "--follow" es realmente un proceso rápido de preprocesamiento sujeto a la lógica de revisión de la revisión, en lugar de ser algo realmente integral.
Literalmente fue diseñado como un "SVN noob" complaciente, no como una "verdadera funcionalidad git". La idea era que te alejarías de la mentalidad (rota) de pensar que los cambios de nombre importan en el panorama general.
Mi pregunta : ¿Cómo obtienen los usuarios hardcore de git entre ustedes el historial de un archivo cuando fue renombrado? ¿Cuál es la forma 'real' de hacer esto?
git mv oldfile newfile
no hace que el cambio de nombre a grabarse en absoluto - es lo mismo que borrar un archivo y añadir otro. git solo resuelve los cambios de nombre y copias del estado del árbol en cada confirmación después del hecho./bin/mv oldfile newfile
), pero luego lo hacegit add newfile; git rm oldfile
, el resultado es indistinguible del degit mv oldfile newfile
.git log --follow
mejora un poco con git 2.9 (junio de 2016): vea mi respuesta a continuación--color-moved
cuandodiff
.Respuestas:
Creo que el impulso general detrás del punto de Linus es que, y tome esto con una pizca de sal, a los usuarios de git hardcore nunca les importa la historia de un "archivo". Pones contenido en un repositorio git porque el contenido en su conjunto tiene un historial significativo.
Un cambio de nombre de archivo es un pequeño caso especial de "contenido" que se mueve entre rutas. Es posible que tenga una función que se mueve entre archivos que un usuario de git puede rastrear funcionalmente con "pico" (por ejemplo
log -S
).Otros cambios de "ruta" incluyen la combinación y división de archivos; git realmente no le importa qué archivo considera renombrado y cuál considera copiado (o renombrado y eliminado) solo rastrea el contenido completo de su árbol.
git fomenta el pensamiento de "árbol completo" en el que muchos sistemas de control de versiones están muy centrados en los archivos. Es por eso que git se refiere a "rutas" con más frecuencia que a "nombres de archivo".
fuente
--follow
esta?--follow
ser el valor predeterminado. Lo que quiero decir es que cuando quiero ver el historial del código dentro de un archivo, realmente no me importa si el archivo fue renombrado o no, solo quiero ver el historial del código, independientemente de los cambios de nombre. Entonces, en mi opinión, tiene sentido--follow
que sea el predeterminado porque no me importan los archivos individuales;--follow
me ayuda a ignorar los cambios de nombre de archivos individuales, que generalmente son bastante intrascendentes.Tengo exactamente el mismo problema que estás enfrentando. Aunque no puedo darte una respuesta, creo que puedes leer este correo electrónico que Linus escribió en 2005, es muy pertinente y podría darte una pista sobre cómo manejar el problema:
Lo encontré referenciado en esta publicación de blog, que también podría ser útil para encontrar una solución viable:
Por favor, manténganos informados sobre su progreso en esto.
fuente
--color-moved
, Git v2.15 agrega un movimiento hacia ese "sistema de seguimiento ideal". Estaba jugando con él para verlo rastrear líneas movidas dentro de un archivo, pero accidentalmente me di cuenta de que rastrea líneas movidas en todo el diff.--follow
puede ser incorrecto (por ejemplo, si 2 archivos tienen el mismo contenido, o si hay una modificación además del movimiento de archivo).Te alegrará saber que algunas herramientas populares de Git UI ahora lo admiten. Hay docenas de herramientas de Git UI disponibles, por lo que no las enumeraré todas, pero por ejemplo:
Más información sobre las herramientas de Git UI:
fuente
Nota: git 2.9 (junio de 2016) mejorará bastante la naturaleza "con errores" de
git log --follow
:Ver commit ca4e3ca (30 mar 2016) por SZEDER Gábor (
szeder
) .(Fusionada por Junio C Hamano -
gitster
- en commit 26effb8 , 13 abr 2016)diffcore: arregla el orden de iteración de archivos idénticos durante la detección de cambio de nombre
(tenga en cuenta la inversión aquí:
B/file -> A/file
yA/file -> B/file
)fuente
En Linux, he verificado que SmartGit y GitEye pueden seguir los cambios de nombre al seguir el historial de un archivo en particular. Sin embargo, a diferencia de gitk y GitEye, SmartGit muestra una vista de archivo y una vista de repositorio separadas (que contiene la estructura de directorios pero no la lista de archivos que contiene)
fuente