2010-08-18 14 views
25

Ich habe eine Reihe von Commits von verschiedenen Autoren und ich würde gerne eine git dff Ausgabe zwischen 2 Commits sehen, aber nur die Commits von einem der Autoren, etwas, wie --author in git Log.git diff mit Autor Filter

Ich interessiere mich für die endgültige Zusammenfassung diff und nicht die Diffs der einzelnen Commits.

Gibt es dafür einen Trick?

+2

Es ist nicht genau ein Duplikat, aber Sie können hier einige nützliche Informationen finden: [Extrahieren Sie relevante Änderungen für die Code-Überprüfung] (http://stackoverflow.com/questions/78339/extract-relevant-changes-for-code-review) –

Antwort

19

Das Problem hier ist, dass Sie dies im allgemeinen Fall nicht tun können. Angenommen, Alice ändert eine bestimmte Datei, dann ändert Bob sie - einschließlich Teile, die Alice geändert hat - und schließlich ändert Alice sie erneut. Wie kombinierst du Alice's Diffs zu einem einzigen Diff? Wenn Sie sie als zwei Patches verwenden, wird die zweite einfach nicht angewendet, ohne dass Bobs Patch zuerst angewendet wird! Aber Sie können den Endzustand auch nicht einfach gegen das Original austeilen, da dies Bobs Änderungen beinhalten wird.

Wenn Sie ein Beispiel mit Git-Operationen bevorzugen, ist dies wie ein interaktives Rebase, und Löschen von zufälligen Commits. Sicher, manchmal klappt es, aber manchmal wird es einfach komplett fehlschlagen, weil eines dieser Commits von einem der Commits abhing.

Also, ich weiß, Sie sagten, Sie nicht einzelnen diffs begehen wollen, aber das ist alles, was Sie wirklich für hoffen können:

git log -p --author=Alice 

Oder wenn Sie für ein einzelnes diff wirklich verzweifelt sind, wird diese erhalten es für Sie, aber nur in den Fällen, in denen Interaktion kein Patch sind wie ich oben erwähnt:

git checkout -b temp first_commit 
git log --pretty=%H --author=Alice first_commit..second_commit | 
while read commit; do 
    git cherry-pick $commit || exit 
done 
# or if you have a new version of git, cherry-pick works with multiple arguments: 
# git cherry-pick $(git log --pretty=%H --author=Alice first_commit..second_commit) 
git diff first_commit temp 

das ist wirklich nicht Operationen in der Arbeit Baum erfordern, weil es absolut keine Garantie, dass eine der Patches gilt, sobald ein Commit wurde übersprungen. Sie müssen nur versuchen und sehen.

0

Mai werden Sie die Formatierungsfunktionen von diff-tree

format:<string> 

Das format:<string> Format, das Sie, welche Informationen Sie anzeigen möchten festlegen können, nutzen könnten.
Es funktioniert ein wenig wie printf Format, mit der bemerkenswerten Ausnahme, dass Sie eine neue Zeile mit %n statt \n erhalten.

Z. B,

format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 

so etwas wie dieses zeigen würde:

The author of fe6e0ee was Junio C Hamano, 23 hours ago 
The title was >>t4119: test autocomputing -p<n> for traditional diff input.<< 

Sie können dann auf dem jeweiligen Autors grep.