¿Por qué no funciona “git log -‌- foo” para el archivo eliminado foo?

89

Mi repositorio sufrió cambios como:

  1. ... algunas confirmaciones no relacionadas ...
  2. Confirmar nuevo archivo foocon 100 líneas de contenido
  3. ... interviniendo compromisos, algunos de los cuales tocan foo...
  4. Inserte el contenido de fooen la parte superior de un archivo existente bary git rm fooen la misma confirmación
  5. ... más confirmaciones no relacionadas ...

Ahora quiero ver el registro del archivo eliminado foo. Todo lo que he leído, incluido SO, dice que debería poder hacerlo git log -- foo, pero ese comando no produce ningún resultado.

Si encuentro la confirmación que incluye la eliminación foo, puedo git log 1234abcd -- fooy veo su registro, entonces creo que mi camino foono es el problema. También tenga en cuenta que las git merge-base HEAD 1234abcdsalidas 1234abcd[...], por lo que creo que debería probar que se puede acceder a la confirmación HEAD. Tenga en cuenta que no hay ningún archivo fooen mi árbol de trabajo (obvio, ya que fue eliminado). Usando Git 1.7.1.1 en OS X.

¿Por qué no me git log -- foofunciona y cómo puedo solucionarlo? ¡Gracias!

user385804
fuente
5
¿Intentaste git log --follow -- fooo git log --follow -M -- foo? (para forzar la detección de cambio de nombre)
VonC
1
Mierda, lo intenté, --followpero al leer historyveo que desde entonces hice un cd en otro lugar cuando lo probé, lo que invalida la ruta. git log --follow -- foofuncionó cuando lo intenté desde el punto de partida correcto. Supongo que Git consideró fooentrar baren una especie de cambio de nombre. En cualquier caso, ¡gracias! Estaré encantado de acreditar esto si lo vuelve a publicar como respuesta.
user385804
1
Molesto que --se cambia a en el título de la pregunta ...
Cascabel

Respuestas:

118

Desea utilizar la --followopción on git log, que se describe en la página de manual como:

Continue listing the history of a file beyond renames.

Efectivamente, esto no solo le permite ver el historial de un archivo renombrado, sino que también le permite ver el historial de un archivo que ya no está en el árbol de trabajo. Por lo tanto, el comando que debe usar debería verse así:

git log --follow -- foo

Actualizar:

Git 2.9+ ahora ha habilitado esto de forma predeterminada para todos los comandos git diffy git log:

Los comandos de nivel de porcelana orientados al usuario final en la familia "git diff" y "git log" habilitan por defecto la detección de cambio de nombre; aún puede usar la variable de configuración "diff.renames" para deshabilitar esto.

¡Gracias a x-yuri por el aviso!

Nathan Kleyn
fuente
1
Funcionó para mí sin la --followpieza. Solo necesitaba agregar --. Estoy corriendo git-2.9.0.
x-yuri