2012-05-22 12 views
6

Quando uso un argomento <path> con git log --stat per limitare il registro per commit modifica <path>, liste Git <path> come unico file modificato quando visualizzazione dei commit selezionati. Vorrei invece vedere tutti i modificati i percorsi elencati per ciascun commit selezionato.Come rendere `git log --stat - <path>` mostra * tutti * i file nei commit selezionati?

Ad esempio:

$ 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(-) 

Nota che il secondo git log, con l'argomento percorso a.txt, dice "1 file modificati", quando in realtà "2 file modificati". Vorrei git per dirmi che entrambi a.txt e b.txt sono stati modificati, anche se I ha selezionato il commit in base al percorso a.txt.

AGGIORNAMENTO: @jacknagel ha risposto alla mia domanda, ma risulta che la sua soluzione non funziona nel mio caso d'uso reale. Nel mio caso d'uso reale, sto cercando tutti i commit che hanno modificato un file, compresi i nomi, in un caso in cui due progetti correlati si sono divergenti. Devo capire quali cambiamenti in un progetto implicano cambiamenti corrispondenti (che devo fare) nell'altro progetto. Sfortunatamente, git si lamenta quando provo a usare --full-diff e --follow allo stesso tempo.

Quindi, a mio situazione reale, che sto provando a fare funzionare:

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

e una soluzione che funziona in questo caso è:

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

Che cosa mai si chiede non ha molto senso per me. Come ti aspetti che un comando si comporti diversamente da come è previsto? Quando dai il nome del file stai dicendo a git di ottenere da solo i dettagli di quel file. Se vuoi che mostri entrambe le cose, usa il comando – positron

+0

@positron: sto usando il nome del file per identificare i commit di interessi, ma per quei commit voglio le informazioni complete. In sostanza, sto utilizzando il nome file specificato per identificare altri nomi di file * sconosciuti * di interesse. Quindi, non posso dire 'git' gli altri file, perché non so cosa siano. – ntc2

+0

Invece di modificare la * domanda * per aggiungere una risposta, il modo StackOverflow è di aggiungere una risposta, anche se è una tua domanda. Mi sono permesso di aggiungere la risposta corretta, ma lo eliminerò volentieri se lo pubblichi da solo – djeikyb

risposta

9

È possibile ottenere questo comportamento utilizzando l'opzione --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

Grazie! Questo risponde alla domanda che ho posto e quindi accetto la risposta. Tuttavia, la mia domanda non è stata abbastanza specifica, e '--full-diff' non funziona nella mia situazione reale, dove sto usando' --follow'. Aggiornerò la domanda e aggiungerò una soluzione che funziona con '--follow' in un'altra risposta. – ntc2

-1

Come si aspetta un comando per comportarsi in un modo diverso da quello che è destinato a fare? Quando dai il nome del file stai dicendo a git di ottenere da solo i dettagli di quel file. Se si desidera visualizzare sia i file quindi utilizzare il comando

git log -n1 --stat . 

o

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

Penso che l'idea sia di dire a git "mostrami solo commit che tocchino , ma quando mostri quei commit, lista tutto ciò che hanno fatto ". – jacknagel

+0

@jacknagel: esattamente. – ntc2

0

prima trovare il commit ids , quindi collegarli a xargs (o gnu parallel) per alimentare ciascun ID su git show.

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

Su finestre con PowerShell, qualcosa di simile a questo dovrebbe funzionare (ma non l'ho provato ancora ..):

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