¿Por qué git log no muestra el historial de un archivo movido y qué puedo hacer al respecto?


91

Cambié el nombre de un par de archivos usando git mv, usado git stash, eché un vistazo rápido a HEAD (sin cambiarlo) y luego lo hice git stash poppara recuperar todo el lote nuevamente. Mis movimientos habían desaparecido de la lista de confirmaciones, así que los rehice git rmy el mensaje de confirmación afirmaba que git había detectado que el cambio de nombre era un cambio de nombre. Así que no pensé más en eso.

Pero ahora, después de la confirmación, ¡no puedo acceder al historial de los archivos movidos! Esto es lo que dice git sobre la confirmación en cuestión:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Ahora estoy tratando de obtener el historial de uno de estos archivos movidos, para poder ver una versión anterior, pero no obtengo nada muy útil:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(También he intentado sin -M, -Cy --find-copies-harder, pero fue en vano.)

Puedo obtener su historial con su nombre anterior, que se detiene en el punto en que se eliminó de su ubicación anterior:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Así que no estoy completamente estancado esta vez, pero no me gustaría tener que hacer este tipo de cosas todo el tiempo. (Anticipo tener una buena cantidad de archivos que se moverán al menos una vez en su vida).

¿Estoy haciendo algo mal? La copia antigua del archivo y la nueva copia son 98,8% iguales (2 líneas de 166 cambiadas). Tengo entendido que git debería poder rastrear el archivo en este caso, porque infiere operaciones de cambio de nombre en lugar de almacenarlas explícitamente, y los archivos son lo suficientemente similares como para que creo que debería considerarlos iguales.

¿Hay algo que pueda hacer para solucionar este problema?


Adivina: ¿Funciona si ejecutas el comando dentro de ~ / projects / en lugar de ~ / projects / system / runtime / src?
Douglas

No, obtengo el mismo resultado. (Por lo general Git parece muy bien por que le permite ser en cualquier carpeta de todos modos ...)

Sin embargo, eso me dio una idea y actualicé la pregunta con mis hallazgos. ¡Gracias por el comentario!

Estoy usando "tortoiseGit 1.5.8.0" junto con "1.7.3.1.msysgit.0" en mswindows. Cuando cambio de nombre + confirmo un archivo en el explorador, veo en mi interfaz gráfica de usuario "status = Rename". No sé lo suficiente sobre git cómo hacer esto en la línea de comandos para responder "cómo hacer eso", pero tortoiseGit hizo algo por mí que funcionó como esperabas.
k3b

Respuestas:



28

Bueno, veo mis cambios de nombre con git log -M --summary..


git log -M --summaryno proporciona ninguna información de cambio de nombre si solo está mirando el historial de un archivo determinado, es decir, con un argumento de archivo.
vinc17

17

Respondiendo a mi propia pregunta, ya que he logrado calmar mis inquietudes, incluso si no he resuelto mi problema exactamente. ( git log --followAunque todavía no funciona para mí).

En primer lugar, el --summaryregistro de la confirmación de cambio de nombre incluye la deletelínea con el nombre anterior del archivo. Entonces, si es fácil de detectar, puede encontrar su nombre anterior y git logdesde allí.

Si es parte de una confirmación grande y, por lo tanto, un poco más difícil de detectar, y esta situación fue una de mis preocupaciones, git blame -Cse puede usar con el nuevo nombre del archivo en la primera revisión posterior al cambio de nombre. ¡Presumiblemente quedan líneas del archivo original! - por lo que git debería encontrar su fuente y mostrar el nombre del archivo antiguo (y un hash de confirmación por si acaso). A continuación, puede seguir el rastro con git log.

Entonces, si tiene algún interés en el historial del archivo como una unidad (por el motivo que sea), entonces parece que se puede hacer de manera relativamente sencilla. Aunque tengo la impresión de que git preferiría que lo usaras correctamente.


6
Creo que necesita la opción -M para mostrar cambios de nombre en lugar de eliminar / agregar
Adrian Cornish

1
Acabo de tener el mismo problema y noté que su directorio de trabajo hace una diferencia git log --follow .donde el directorio de trabajo es la nueva ubicación no funciona, mientras que git log --follow path/to/new/dir, ejecutado desde un directorio principal común de la antigua y la nueva ubicación, funciona
akraf

1
El --followparámetro funciona, pero debe hacerlo:git log --follow -- ./path/to/file
DrumM

Acabo de tener el problema que se git -log filename.csdetiene en la confirmación del movimiento del archivo (el directorio actual está configurado en la carpeta del archivo). Sin embargo, la ventana del historial de VS muestra todo el registro de cambios del archivo. También puedo ver que el archivo se ha movido con el escritorio de Github. Pero también git log -10 --follow filename.csmuestra el registro antes de mover el compromiso.
oleksa

12
git log --follow ./path/to/file

Creo que esto es lo que estás buscando.


3
La respuesta de cinco años antes tiene esta información.
dotancohen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.