2012-05-22 12 views
6

Cuando utilizo un argumento <path> con git log --stat para limitar el registro a compromete la modificación de <path>, listas git <path> como el único archivo modificado cuando mostrar las confirmaciones seleccionados. En cambio, me gustaría ver rutas modificadas enumeradas para cada confirmación seleccionada.Cómo hacer que `git log --stat - <path>` muestre * todos * los archivos en commits seleccionados?

Por ejemplo:

$ echo test > a.txt 
$ echo test > b.txt 
$ git add a.txt b.txt 
$ git commit -m test 
[...] 
2 files changed, 2 insertions(+), 0 deletions(-) 
[...] 
$ git log -n1 --stat 
[...] 

a.txt | 1 + 
b.txt | 1 + 
2 files changed, 2 insertions(+), 0 deletions(-) 
$ git log -n1 --stat -- a.txt 
[...] 

a.txt | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

Tenga en cuenta que el segundo git log, con el argumento de ruta a.txt, dice "1 archivos cambiados", cuando en realidad "2 archivos cambiados". Me gustaría que git me diga que tanto a.txt como b.txt han cambiado, aunque I seleccionó la confirmación según la ruta a.txt.

ACTUALIZACIÓN: @jacknagel respondió mi pregunta, pero resulta que su solución no funciona en mi caso de uso real. En mi caso de uso real, estoy buscando todas las confirmaciones que modificaron un archivo, incluidos los cambios de nombre, en un caso en que dos proyectos relacionados divergieron. Necesito descubrir qué cambios en un proyecto implican cambios correspondientes (tengo que hacer) en el otro proyecto. Desafortunadamente, git se queja cuando trato de usar --full-diff y --follow al mismo tiempo.

Por lo tanto, en mi situación real, estoy tratando de correr:

git log --stat --follow -- a.txt 

y una solución que funciona en este caso es:

git log --format='%H' --follow -- a.txt | xargs git show --stat -C 
+0

Lo que nunca le preguntas no tiene mucho sentido para mí. ¿Cómo espera que un comando se comporte de una manera diferente a la prevista? Cuando le das el nombre de archivo le dices a git que obtenga los detalles de ese archivo solo. Si quiere que se muestren ambas cosas, use el comando – positron

+0

@positron: estoy usando el nombre del archivo para identificar los commits de intereses, pero para esos commits quiero la información completa. En esencia, estoy usando el nombre de archivo dado para identificar otros nombres de archivos * desconocidos de interés. Entonces, no puedo decirle a 'git' los otros archivos, porque no sé cuáles son. – ntc2

+0

En lugar de editar su * pregunta * para agregar una respuesta, la forma de StackOverflow es agregar una respuesta, incluso si es su propia pregunta. Me he tomado la libertad de agregar la respuesta correcta, pero con mucho gusto la eliminaré si la publicas tú mismo – djeikyb

Respuesta

9

Usted puede obtener este comportamiento usando la opción --full-diff:

--full-diff 
     Without this flag, "git log -p <path>..." shows commits that touch 
     the specified paths, and diffs about the same specified paths. With 
     this, the full diff is shown for commits that touch the specified 
     paths; this means that "<path>..." limits only commits, and doesn't 
     limit diff for those commits. 

     Note that this affects all diff-based output types, e.g. those 
     produced by --stat etc. 
+0

Gracias! Esto responde la pregunta que hice y entonces estoy aceptando la respuesta. Sin embargo, resulta que mi pregunta no era lo suficientemente específica, y '--full-diff' no funciona en mi situación real, donde estoy usando' --follow'. Actualizaré la pregunta y agregaré una solución que funcione con '--follow' en otra respuesta. – ntc2

-1

¿Cómo espera que se comporte de un comando de una manera diferente a la que está destinado a hacer? Cuando le das el nombre de archivo le dices a git que obtenga los detalles de ese archivo solo. Si quieres que se muestre tanto los archivos a continuación, utilizar el comando

git log -n1 --stat . 

o

git log -n1 --stat a.txt b.txt 
+3

Creo que la idea es decir a git "mostrarme solo confirma ese contacto , pero al mostrar esas confirmaciones, lista todo lo que hicieron ". – jacknagel

+0

@jacknagel: exactamente. – ntc2

0

En primer lugar buscar los ID de cometer , luego canalícelos al xargs (o gnu parallel) para alimentar cada identificación al git show.

git log --format='%H' --follow -- a.txt | xargs git show --stat -C 

En las ventanas con PowerShell, algo como esto debería funcionar (pero no he probado todavía ..):

git log --format='%H' --follow -- a.txt | ForEach-Object { git show --stat -C $_ } 
Cuestiones relacionadas