Jak sprawić, aby git wyświetlał listę plików, które są śledzone?

535

Używając git z linii poleceń, w jaki sposób mogę sprawić, aby git wyświetlał listę plików, które są śledzone w repozytorium?

RobertL
źródło
5
możliwy duplikat plików listy w lokalnym repozytorium git?
Kristján
2
Wierzę, że tak. Ale nie wydaje się słuszne oznaczanie tego jako duplikatu, gdy ma lepszą odpowiedź.
lindhe
5
we wszechświecie równoległym nie jest niesamowite, jak podobne jest to pytanie, w tym wszystkie odpowiedzi, a każda z nich ma swój charakterystyczny charakter.
Jeff Puckett

Odpowiedzi:

628

Jeśli chcesz wyświetlić listę wszystkich plików aktualnie śledzonych w ramach oddziału master, możesz użyć tego polecenia:

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

Jeśli chcesz listę plików, które kiedykolwiek istniały (tj. Zawierają usunięte pliki):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
źródło
61
Użyj git ls-tree -r HEAD --name-only, jeśli chcesz wyświetlić listę plików bieżącej gałęzi
Ramast
3
Dlaczego katalogów nie ma na liście?
Shuzheng
13
@NicolasLykkeIversen - gitnie aktualizuje katalogów bezpośrednio. Zamiast tego przechowuje pliki i ich ścieżki. ls-treewyświetli wszystkie wersjonowane pliki. Aby lepiej zrozumieć to rozróżnienie, spróbuj ustawić pusty katalog do git. Pusty katalog nigdy nie pojawi się w zmianach etapowych. Jedynym sposobem na wersję takiego pustego katalogu jest faktyczna wersja pliku w tym katalogu. W przypadkach użycia, w których potrzebujesz takiego pustego katalogu zastępczego w kontroli wersji, możesz utworzyć fikcyjny plik w tym katalogu i wersję tego. Mam nadzieję, że wyjaśnienie jest jasne.
Tuxdude
2
Uwaga: ls-tree masternie pokazuje śledzonych plików w obszarze testowym.
nn0p 18.04.16
Czy można wyświetlić tylko katalog najwyższego poziomu, jeśli zawiera wiele podkatalogów i plików?
Blaszard,
191

Pliki zarządzane przez git są pokazane przez git ls-files. Sprawdź stronę podręcznika.

vonbrand
źródło
4
Wydaje się, że pokazuje tylko pliki w bieżącym katalogu lub poniżej niego.
Lyle Z
11
Czy mogę to edytować, aby uwzględnić odpowiednie sekcje strony podręcznika?
Nathan Basanese
1
@NathanBasanese być może możesz dodać kolejną odpowiedź z tymi informacjami.
José Castro,
@LyleZ Być może ma to być zgodne z ls... lubls -R
flow2k
1
@LyleZ Również to zachowanie jest takie samo jak w przypadku git ls-tree- odnosi się do pwd.
flow2k
18

Akceptowana odpowiedź pokazuje tylko pliki z drzewa bieżącego katalogu. Aby wyświetlić wszystkie śledzone pliki, które zostały zatwierdzone (w bieżącym oddziale), użyj

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree sprawia, że ​​polecenie działa tak, jakbyś był w katalogu głównym repo.
  • -rpowraca do podkatalogów. W połączeniu z --full-treetym zapewnia wszystkie zatwierdzone, śledzone pliki.
  • --name-only usuwa informacje o SHA / uprawnieniach, gdy chcesz tylko ścieżki plików.
  • HEADokreśla gałąź, dla której chcesz mieć listę śledzonych, zatwierdzonych plików. Możesz zmienić to na masterdowolną inną nazwę oddziału, ale HEADjest to zatwierdzenie, które sprawdziłeś w tej chwili.

Jest to metoda od zaakceptowanej odpowiedzi na ~ zduplikowane pytanie https://stackoverflow.com/a/8533413/4880003 .

Nathan
źródło
Dzięki! Działa to również w przypadku nagich transakcji repo.
hzpc-joostk
5

Dzięki temu możesz uzyskać kolorowe wydruki.

Używam tego jednowierszowego do wyświetlania śledzonych plików i katalogów w bieżącym katalogu bieżącej gałęzi:

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

Możesz dodać go jako alias:

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

Jeśli chcesz rekurencyjnie wyświetlać listę plików:

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

I alias:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Cholerny głupiec
źródło
glrAlias podałeś wyglądał nieco dziwnie, więc zrobiłem to wersja bardziej zgodne z formatem pierwszego aliasu podałeś: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Testowane git version 2.20.1na Debianie 10.
baltakatei