Wie liste ich alle Dateien in einem Commit auf?


2793

Ich suche nach einem einfachen gitBefehl, der eine gut formatierte Liste aller Dateien enthält, die Teil des durch einen Hash (SHA1) angegebenen Commits waren, ohne fremde Informationen.

Ich habe versucht:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Obwohl es die Dateien auflistet, enthält es auch unerwünschte Diff-Informationen für jede.

Gibt es einen anderen gitBefehl, der nur die gewünschte Liste bereitstellt, damit ich sie nicht aus der git showAusgabe analysieren kann ?


43
Ich bin hierher gekommen, um etwas anderes zu suchen. Ich möchte, dass alle Dateien für eine Reihe von Commits geändert und git log --until 2013-05-21 --pretty="short" --name-onlymit einem guten Effekt abgeschlossen werden.
Begrenzte Versöhnung

4
Verwenden Sie diesen Befehl, um alle Änderungen von vorherigen nCommits zu erhalten, bis master:git diff-tree --name-status -r @{3} master
ako

3
git diff --name-only master- Um ALLE geänderten Dateien im aktuellen Zweig aufzulisten, im Vergleich zum Hauptzweig.
Noam Manos

Antworten:


3762

Bevorzugter Weg (weil es sich um einen Installationsbefehl handelt ; programmatisch):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Ein anderer Weg (weniger bevorzugt für Skripte, da es sich um einen Porzellanbefehl handelt ; er soll dem Benutzer zugewandt sein)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • Das --no-commit-idunterdrückt die Ausgabe der Commit-ID.
  • Das --prettyArgument gibt eine leere Formatzeichenfolge an, um die Kruft am Anfang zu vermeiden.
  • Das --name-onlyArgument zeigt nur die betroffenen Dateinamen (Danke Hank). Verwenden Sie --name-statusstattdessen, wenn Sie sehen möchten, was mit jeder Datei passiert ist ( D eleted, M odified, A dded).
  • Das -rArgument ist, in Unterbäume zurückzukehren

25
Es sollte beachtet werden, dass diff-treedies beim Betrachten des Root-Commits nicht funktioniert.
Jbranchaud

327
Wenn Sie die --name-onlyOption durch ersetzen --name-status, erhalten Sie eine klarere Zusammenfassung.
Kurt Zhong

20
Wenn Sie möchten, dass es beim Root-Commit funktioniert, verwenden Sie das Flag --root. Auf der Manpage: "Wenn --root angegeben wird, wird das anfängliche Commit als großes Erstellungsereignis angezeigt. Dies entspricht einem Unterschied zum NULL-Baum."
Chris

24
git log --name-only -n 1 <hash>Das letzte Commit wäre:git log --name-only -n 1 HEAD~1..HEAD
Kurt

10
Wenn sich jemand fragt (wie ich), warum der erste Weg "bevorzugt" ist, geht er auf @drizzts Kommentar zurück; git showist "Porzellan" (soll dem Benutzer zugewandt sein) und git diff-treeist "Sanitär" (soll programmgesteuert verwendet werden, z. B. aus Skripten). Die Schnittstelle für die ehemaligen kann im Laufe der Zeit ändern (so die git Maintainer fallen können , --name-onlyobwohl ich mich nicht vorstellen , sie würden ) für useability Gründe, während die Schnittstelle für die letztere wird so stabil wie möglich aus Kompatibilitätsgründen beibehalten werden.
Killscreen

237

Wenn Sie eine Liste der geänderten Dateien erhalten möchten:

git diff-tree --no-commit-id --name-only -r <commit-ish>

Wenn Sie eine Liste aller Dateien in einem Commit erhalten möchten, können Sie verwenden

git ls-tree --name-only -r <commit-ish>

1
Der ls-Baum mit --name-only scheint unter 1.6.4.4 oder 1.6.3.3 nicht zu funktionieren. Glaubst du, das ist ein Fehler?
Krosenvold

git ls-tree --name-only HEAD(Der Parameter <commit-ish> ist erforderlich ; in diesem Beispiel ist es HEAD) funktioniert für mich mit der Git-Version 1.6.4.3
Jakub Narębski,

2
Es stellt sich heraus, dass die Reihenfolge der Parameter hier von Bedeutung ist. Der in Ihrem Beitrag funktioniert nicht, während der in Ihrer Antwort funktioniert - zumindest bis Sie Ihren Beitrag aktualisieren;)
krosenvold

5
Pass --no-commit-id, um das Drucken des SHA1 zu vermeiden, wie folgt:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor

3
@CoDEmanX: Sie haben das Hinzufügen von -r/ -toption nicht verpasst , oder? Weil diff-tree sowohl geänderte als auch hinzugefügte Dateien verarbeitet. Wenn Sie alle neuen (hinzugefügten) Dateien git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
auflisten

226

Ich gehe einfach davon aus, dass dies gitknicht erwünscht ist. Versuchen Sie es in diesem Fall git show --name-only <sha>.


36
--name-only ist in den meisten Fällen, in denen ich es brauchte, ausreichend; Daher die kürzeste Lösung (und die einzige, an die ich mich in einem Versuch erinnern würde).
Erik S

25
Oder --name-status.
Neil Traft

Als jemand, der CLI Git wirklich mag, gitkist dies eine gute Möglichkeit, die Dateien zu überprüfen und die Datei anzuzeigen, in der sich der Diff befindet. zB Code, der ein Monster-Commit von einem Peer überprüft.
Elijah Lynn

192

Ich persönlich verwende die Kombination von --stat und --oneline mit dem Befehl show :

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

Wenn Sie die Statistiken zum Hinzufügen / Entfernen nicht mögen / möchten, können Sie --stat durch --name-only ersetzen

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

4
Das ist toll! Grundsätzlich erhalten Sie die Dateizusammenfassung, die Github oben in einer Commit-Ansicht anzeigt. Vielen Dank.
Trisweb

Sehr schön. So definieren Sie einen Alias: alias gits='git show --stat --oneline'zeigt dann gitsselbst die neuesten Änderungen (in HEAD) an, während gits b24f5fbdie Änderungen einer Revision angezeigt werden können.
Brent Faust

5
Man könnte auch einen Git-Alias ​​erstellen ... zB vielleicht git config --global alias.changes 'show --stat --oneline'. Dann können Sie git changes(mit einem optionalen Commit-ish) eingeben und die Ausgabe aus den ersten Beispielen oben erhalten.
Lindes

Git für Windows erfordert doppelte Anführungszeichen:git config --global alias.changes "show --stat --oneline"
Alchemistmatt

3
Nett. Und im Gegensatz zu der akzeptierten Antwort git showfunktioniert auch die Überprüfung von versteckten Änderungen: zBgit show --stat --oneline stash@{1}
Jeff Ward

83

Sie können auch tun

git log --name-only

Sie können verschiedene Commits, Commit-Nachrichten und die geänderten Dateien durchsuchen.

Geben Sie q ein, um Ihre Eingabeaufforderung zurückzugewinnen.


Danke, es hilft. Übrigens: Verwenden Sie git show 5944ad2a8b5 --name-onlydiese
Option, um

68

Vor kurzem musste ich alle geänderten Dateien zwischen zwei Commits auflisten. Also habe ich diesen (auch * nix-spezifischen) Befehl verwendet

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Update : Oder wie Ethan unten betont

git diff --name-only START_COMMIT..END_COMMIT

Die Verwendung umfasst --name-statusauch die Änderung (hinzugefügt, geändert, gelöscht usw.) neben jeder Datei

git diff --name-status START_COMMIT..END_COMMIT

4
Wenn Sie verwenden, git diff --name-status START_COMMIT..END_COMMITbrauchen Sie das Trailing nicht |sort | uniq.
Ethan

Korrektur des obigen Kommentars:git diff --name-only START_COMMIT..END_COMMIT
Ethan

Das habe ich gesucht. Wie ich es benutzt habe : git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Ich wollte eine Liste mit Codeänderungen nur für eine große PR, die Tausende von PNGs und XML-Layouts hinzugefügt hatte.
AutonomousApps

63

Einfachste Form:

git show --stat (hash)

Das ist leichter zu merken und gibt Ihnen alle Informationen, die Sie brauchen.

Wenn Sie wirklich nur die Namen der Dateien möchten, können Sie die --name-onlyOption hinzufügen .

git show --stat --name-only (hash)


2
--name-only enthält weiterhin einige Kopfzeilen mit Informationen wie Autor, Datum und Festschreibungsnachricht.
verschlang Elysium

Nur einer, den ich gefunden habe, funktioniert für das Merge-Commit
Alex Punnen

47

Ich benutze ziemlich oft geänderten Alias. So richten Sie es ein:

git config --global alias.changed 'show --pretty="format:" --name-only'

dann:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

Ähnliche Befehle, die nützlich sein können:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

40

Verwenden

git log --name-status

Dies zeigt Ihnen die Commit-ID, die Nachricht, die geänderten Dateien und ob sie geändert, erstellt, hinzugefügt oder gelöscht wurden. Etwas wie ein All-in-One-Befehl.


38

Verwenden des Standardbefehls git diff (auch für Skripte geeignet):

git diff --name-only <sha>^ <sha>

Wenn Sie auch den Status der geänderten Dateien wünschen:

git diff --name-status <sha>^ <sha>

Dies funktioniert gut mit Merge-Commits.


26

Versuchen Sie diesen Befehl für den Namen und ändert die Zeilennummer

git show --stat <commit-hash>

Nur Dateinamen anzeigen

git show --stat --name-only  <commit-hash>

Versuchen Sie diesen Befehl, um den letzten Commit-Hash zu erhalten

git log -1

Letzte Festschreibung mit Dateinamen anzeigen und Dateistatus ändern, erstellen oder löschen

 git log -1 --oneline --name-status <commit-hash>

oder für alle

git log

Weitere Informationen zum Git-Protokoll finden Sie in diesem Artikel

https://devhints.io/git-log-format

https://devhints.io/git-log


1
@DanFare "fatal: nicht erkanntes Argument: --names-only" von 2.20.1.windows.1
user2864740

24
$ git log 88ee8 ^ .. 88ee8 - nur name --pretty = "format:"

20

OK, es gibt verschiedene Möglichkeiten, alle Dateien in einem bestimmten Commit anzuzeigen ...

Um die Informationen zu reduzieren und nur die Namen der Dateien anzuzeigen, die festgeschrieben wurden, können Sie einfach hinzufügen --name-onlyoder --name-statuskennzeichnen ... Diese Flags zeigen Ihnen nur die Dateinamen, die sich von den vorherigen Festschreibungen unterscheiden, wie Sie möchten ...

So können Sie git diffvon gefolgt --name-only, mit zwei Hashes begehen nach <sha0> <sha1>, so etwas wie unten:

git diff --name-only 5f12f15 kag9f02 

Ich erstelle auch das folgende Bild, um alle Schritte zu zeigen, die in dieser Situation ausgeführt werden müssen:

git diff --name-only 5f12f15 kag9f02


Warum zwei Refs (Sie nennen sie Hashes)?
hakre

15

Ich benutze dies, um eine Liste der geänderten Dateien zwischen zwei Änderungssätzen zu erhalten:

git diff --name-status <SHA1> <SHA2> | cut -f2

Ja, aber der Status kann durchaus nützlich sein (für isntance möchten Sie vielleicht grep, um alle Dateien außer denen anzuzeigen, die mit so etwas wiegit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson


14

Es gibt auch git whatchanged, was niedriger ist alsgit log

NAME
       git-whatchanged - Show logs with difference each commit introduces

Es gibt die Festschreibungszusammenfassung mit einer Liste von Dateien mit ihren Modi darunter aus und falls vorhanden ( A), gelöscht ( D) oder geändert ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Würde so etwas geben wie:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

Ich weiß, dass diese Antwort nicht wirklich mit "ohne fremde Informationen" übereinstimmt, aber ich denke immer noch, dass diese Liste nützlicher ist als nur die Dateinamen.


Plus, nur ein Befehl, whatchangedanstatt Parameter anzugeben.
Gabrielius

11

Ich mag das:

git diff --name-status <SHA1> <SHA1>^

Ich denke, dies bringt den Status der A& D(Hinzufügen und Löschen) -Datei rückwärts, da der Unterschied vom angegebenen Commit zum vorherigen Commit angezeigt wird und nicht umgekehrt. Es sollte sein git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi

11

Verwenden Sie einen einfachen einzeiligen Befehl, wenn Sie nur möchten, dass die Liste der Dateien beim letzten Festschreiben geändert wird:

git diff HEAD~1 --name-only

8

Listen Sie die Dateien auf, die sich in einem Commit geändert haben:

git diff --name-only SHA1^ SHA1

Dies zeigt keine Protokollnachrichten, zusätzlichen Zeilenumbrüche oder andere Unordnung an. Dies funktioniert für jedes Commit, nicht nur für das aktuelle. Ich bin mir nicht sicher, warum es noch nicht ganz erwähnt wurde, also füge ich es hinzu.


Diese beiden sehen gleich aus: git diff SHA1^ SHA1und git show SHA1.
Vladimir Vukanac

1
@mrW Diese Befehle erzeugen eine ähnliche Ausgabe, zeigen aber git showauch die
Festschreibungsnachricht

8

Zeigen Sie das Protokoll an.

COMMIT kann leer ("") oder sha-1 oder sha-1 verkürzt sein.

git log COMMIT -1 --name-only

Dadurch werden nur die Dateien aufgelistet, die für die weitere Verarbeitung sehr nützlich sind.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"

8

Eine perfekte Antwort darauf gefunden:

git show --name-status --oneline <commit-hash>

Damit ich es wissen kann

which files were just modified M

Which files were newly added , A

Which files were deleted , D

5

Eine Kombination aus " git show --stat" (danke Ryan) und ein paar sed-Befehlen sollte die Daten für Sie reduzieren:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

Dadurch wird nur die Liste der geänderten Dateien erstellt.


5

Es gibt einen einfachen Trick, den Sie als Dateiliste anzeigen können. Fügen Sie ihn einfach :nach dem Hash hinzu.

git show 9d3a52c474:

Sie können dann bohren,

git show 9d3a52c474:someDir/someOtherDir

Wenn Sie auf eine Datei klicken, erhalten Sie die Rohversion der Datei. Das ist manchmal das, was Sie wollen, wenn Sie nur nach einer netten Referenz oder wichtigen Codeteilen suchen (Unterschiede können alles durcheinander bringen).

git show 9d3a52c474:someDir/someOtherDir/somefile

Der einzige Nachteil dieser Methode ist, dass ein Dateibaum nicht einfach angezeigt wird.


3
git show HEAD@{0}

funktioniert gut für mich


2

Ich benutze dies, um eine Liste der geänderten Dateien in Merge Commit zu erhalten

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

oder

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

2

Wenn Sie das Plugin oh-my-zsh und git verwenden, ist die Verknüpfung glg hilfreich.


3
Haben Sie gerade ... den gesamten Code aus Ihrer Antwort herausgeschnitten? Darauf habe ich mich überhaupt nicht bezogen. Keine fremden Informationen in der Ergebnisausgabe, wie von OP gefragt, nicht in Ihrer Antwort! Sie haben immer noch eine Antwort, die VIELE fremde Informationen ausgibt. Aber jetzt ist es nur viel weniger genau beschrieben. OP wollte eine Liste von Dateien ausgeben und nichts weiter. Schauen Sie sich an, was glgausgegeben wird: viel mehr. Entschuldigung für die Verwirrung.
RomainValeri

0

Nur die Dateiliste (nicht einmal Commit-Nachricht):

git show --name-only --pretty=format:

Öffnen Sie beispielsweise alle geänderten Dateien in Ihrem Editor:

"$EDITOR" $(git show --name-only --pretty=format:)

-2

Ich dachte, ich würde eine Zusammenfassung meines Alias ​​teilen. Außerdem finde ich die Verwendung von 'zsh' großartig mit Git It Chroma Keys.

Für diejenigen, die von SVN berichten, ist dies nützlich: (Dies ist eine Kombination von Ideen aus verschiedenen Threads. Ich kann nur wissen, wie man Kopieren / Einfügen verwendet.)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m

-3

Das sollte funktionieren:

git status

Dies zeigt, was nicht inszeniert ist und was inszeniert wird.


7
Bei der Frage geht es jedoch darum, die Liste der Dateien in einem zuvor festgeschriebenen Commit abzurufen, nicht um das festzuschreibende Commit.
Rup
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.