2009-06-02 11 views
16

Después de mover un archivo en git (usando git mv), al mirar el registro de ese archivo solo se muestran los commits que incluyen y después del movimiento.En git, ¿puedes ver las confirmaciones más antiguas aplicadas a un archivo una vez que se han movido?

¿Hay alguna manera de ver las confirmaciones aplicadas al archivo con su nombre anterior? En el ejemplo, a continuación, me gustaría ver commits b04033bdc44f1 y 8ca40d563ce5d en git log después de que haya realizado el cambio.

$ git init 
Initialized empty Git repository in /Users/ben/code/git_mv_example/.git/ 
$ touch foo 
$ git add foo 
$ git commit -m "Initial commit" 
Created initial commit 8ca40d5: Initial commit 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 foo 
[master*]$ echo "abcdefg" > foo 
[master*]$ git commit -a -m "edited foo" 
Created commit b04033b: edited foo 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ git log foo 
commit b04033bdc44f1eb3477270b4b7ca727377d8c03a 
Author: Ben Brinckerhoff <[email protected]> 
Date: Tue Jun 2 13:26:53 2009 -0600 

    edited foo 

commit 8ca40d563ce5d07d965bfb75a01b9c23378fd321 
Author: Ben Brinckerhoff <[email protected]> 
Date: Tue Jun 2 13:26:15 2009 -0600 

    Initial commit 
$ git mv foo bar 
[master+]$ git commit -a -m "renamed foo to bar" 
Created commit 2bccdf6: renamed foo to bar 
1 files changed, 0 insertions(+), 0 deletions(-) 
rename foo => bar (100%) 
$ git log bar 
commit 2bccdf6fc65b9da5b279d9f1117e436549dd3a7b 
Author: Ben Brinckerhoff <[email protected]> 
Date: Tue Jun 2 13:27:14 2009 -0600 

    renamed foo to bar 
$ git log foo 
fatal: ambiguous argument 'foo': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions 

¿Esto no es posible? O tal vez es git log el comando equivocado para esto?

Respuesta

16

'git-log -M' dará la historia comprometerse con la información de cambio de nombre, como se ha mencionado in GitFaq "Why does git not "track" renames ?"

La maquinaria diff en Git tiene soporte para renombrado detección automática, este es encendido por el '-M' interruptor a la git-diff-* familia de comandos.
La maquinaria de detección de cambio de nombre es utilizada por git-log y git-whatchanged.
Git también es compatible con una forma limitada de fusión entre cambios de nombre. Las dos herramientas para asignar la culpa, git-blame y git-annotate usan el código de detección de cambio de nombre automático para rastrear los nombres.

Como un caso muy especial, 'git log' versión 1.5.3 y más tarde ha '--follow' opción que le permite seguir renombra cuando se administra una sola trayectoria.


en su ejemplo:

F:\prog\git\test\rename>git log --follow bar 
commit 81f52b91eb2fc7ad18051c93f3e4d583f27c15ca 
Author: VonC <> 
Date: Tue Jun 2 21:54:43 2009 +0200 

    renamed foo to bar 

commit 71aff26ace6ab249ab2042d1e5d20377486ce478 
Author: VonC <> 
Date: Tue Jun 2 21:54:19 2009 +0200 

    edited foo 

commit c893199da767eddac6a547b940557435ade4d18c 
Author: VonC <> 
Date: Tue Jun 2 21:53:51 2009 +0200 

    initial commit 

Nota: todo esto es posible debido a que no modificó drásticamente el contenido de foo antes de cambiar el nombre a la barra. Si el contenido fuera completamente diferente, la opción --follow no podría obtener el historial completo.

+0

Impresionante, gracias por la gran respuesta! –

5

Respuesta corta: utilizar

$ git log -M --follow bar 

o

$ git log -M -- foo bar 

especificando tanto viejo y nuevo nombre.

Por cierto, como git utiliza la detección de renombrado basada en similitudes heurísticas, los ejemplos de juguetes podrían no funcionar como usted quiere, mientras que los ejemplos de la vida real (o ejemplos con más contenidos sin modificar) funcionarían como se esperaba.

Tenga en cuenta que en git ruta como argumento para git-log no es filtro de ruta, sino limitador de ruta (y puede ser, por ejemplo, un directorio).

+0

Buenos puntos. +1. ¿Podrías detallar la parte de "detección de renombre basada en similitudes heurísticas" relacionada con ejemplos de "juguetes" a diferencia de ejemplos de la vida real? – VonC

+0

Eche un vistazo al resultado de ejemplo para probar que renombre la detección en el conjunto de pruebas git, p. http://repo.or.cz/w/git.git?a=blob;f=t/t4001-diff-rename.sh –

Cuestiones relacionadas