Wie kann ich git dazu bringen, eine Liste der Dateien anzuzeigen, die verfolgt werden?

535

Wie kann ich mithilfe der Befehlszeile git eine Liste der Dateien anzeigen lassen, die im Repository verfolgt werden?

RobertL
quelle
5
Mögliches Duplikat von Listendateien im lokalen Git Repo?
Kristján
2
Ich glaube es ist. Es fühlt sich jedoch nicht richtig an, dies als Dup zu markieren, wenn dies eine bessere Antwort hat.
Lindhe
5
In einem Paralleluniversum ist es unheimlich, wie ähnlich diese Frage alle Antworten enthält, aber jede mit ihrem eigenen Flair.
Jeff Puckett

Antworten:

628

Wenn Sie alle Dateien auflisten möchten, die derzeit unter dem Zweig verfolgt werden master, können Sie diesen Befehl verwenden:

git ls-tree -r master --name-only

Wenn Sie eine Liste der Dateien wünschen, die jemals existierten (dh einschließlich gelöschter Dateien):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
quelle
61
Verwenden Sie git ls-tree -r HEAD --name-only, wenn Sie Dateien des aktuellen Zweigs
auflisten
3
Warum werden Verzeichnisse nicht aufgelistet?
Shuzheng
13
@NicolasLykkeIversen - gitVersionsverzeichnisse nicht direkt. Stattdessen werden Dateien und ihre Pfade gespeichert. ls-treegibt alle versionierten Dateien aus. Versuchen Sie, ein leeres Verzeichnis in zu stellen, um diese Unterscheidung besser zu verstehen git. Das leere Verzeichnis wird in den bereitgestellten Änderungen niemals angezeigt. Die einzige Möglichkeit, ein solches leeres Verzeichnis zu versionieren, besteht darin, eine Datei unter dem Verzeichnis tatsächlich zu versionieren. Für Anwendungsfälle, in denen Sie ein solches leeres Platzhalterverzeichnis in der Versionskontrolle benötigen, können Sie eine Dummy-Datei unter dem Verzeichnis erstellen und diese versionieren. Ich hoffe die Erklärung ist klar.
Tuxdude
2
Beachten Sie nur, ls-tree masterdass die verfolgten Dateien nicht im Staging-Bereich angezeigt werden.
nn0p
Ist es möglich, nur das Verzeichnis der obersten Ebene anzuzeigen, wenn es viele Unterverzeichnisse und Dateien enthält?
Blaszard
191

Die von git verwalteten Dateien werden von angezeigt git ls-files. Schauen Sie sich die Handbuchseite an.

vonbrand
quelle
4
Das scheint nur Dateien im oder unter dem aktuellen Verzeichnis anzuzeigen.
Lyle Z
11
Stört es Sie, wenn ich dies so bearbeite, dass es die relevanten Abschnitte der Handbuchseite enthält?
Nathan Basanese
1
@ NathanBasanese Vielleicht können Sie mit diesen Informationen eine weitere Antwort hinzufügen.
José Castro
@LyleZ Vielleicht soll dies im Einklang mit ls... oderls -R
flow2k
1
@LyleZ Auch dieses Verhalten ist das gleiche mit git ls-tree- es ist relativ zu pwd.
flow2k
18

Die akzeptierte Antwort zeigt nur Dateien im Baum des aktuellen Verzeichnisses an. Verwenden Sie, um alle nachverfolgten Dateien anzuzeigen, die festgeschrieben wurden (im aktuellen Zweig)

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree Lässt den Befehl so laufen, als ob Sie sich im Stammverzeichnis des Repos befinden.
  • -rrekursiv in Unterverzeichnisse. In Kombination mit erhalten --full-treeSie alle festgeschriebenen, nachverfolgten Dateien.
  • --name-only Entfernt SHA- / Berechtigungsinformationen, wenn Sie nur die Dateipfade möchten.
  • HEADGibt an, für welchen Zweig die Liste der verfolgten, festgeschriebenen Dateien verwendet werden soll. Sie können dies in mastereinen anderen Filialnamen ändern, dies HEADist jedoch das Commit, das Sie gerade ausgecheckt haben.

Dies ist die Methode aus der akzeptierten Antwort auf die ~ doppelte Frage https://stackoverflow.com/a/8533413/4880003 .

Nathan
quelle
Vielen Dank! Dies funktioniert auch für reine Repos.
Hzpc-Joostk
5

Möglicherweise möchten Sie damit eine farbige Ausgabe.

Ich verwende diesen Einzeiler, um die verfolgten Dateien und Verzeichnisse im aktuellen Verzeichnis des aktuellen Zweigs aufzulisten:

ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)

Möglicherweise möchten Sie es als Alias ​​hinzufügen:

alias gl='ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)'

Wenn Sie Dateien rekursiv auflisten möchten:

'ls' --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)

Und ein Alias:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Verdammter Dummkopf
quelle
Der von glrIhnen angegebene Alias ​​sah etwas seltsam aus, daher habe ich eine Version erstellt, die dem Format des ersten von Ihnen angegebenen Alias ​​besser entspricht : alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Getestet mit git version 2.20.1auf Debian 10.
Baltakatei