2012-05-04 14 views
15

Używam msysgit (1.7.9) i szukam prawej wywołaniu komendy git ls-files aby pokazać tylko (śledzone) plików i katalogów na obecnym poziomie, albo z indeksu lub bieżącej pracy katalog, jeśli jest to łatwiejsze.jak "git ls-files" dla tylko jednego poziomu katalogu.

Zasadniczo dałoby to wykaz katalogów podobny do tego, który można zobaczyć na Github. Pochodzę z Windows, nie jestem zbyt zaznajomieni z właściwego sposobu wykonywania globbing (?).

Odpowiedz

14

myślę chcesz git ls-tree HEAD sed'd do smaku. Drugie słowo wyjścia ls-tree będzie tree dla katalogów, blob plików, commit dla submodulesm, nazwa pliku jest wszystko po karcie ascii

+1

'git ls-files | awk -F/'{print $ 1}' uniq | xargs ls -dl --color = auto' – iegik

+0

@iegik To jest znacznie lepsze. Zamiast "awk" użyłbym "sed s, /. *", Ponieważ jest krótszy. Proszę o odpowiedź, proszę? Oddam to. – jthill

+0

Nie działa na macOS - 'ls: niedozwolona opcja-". Myślę, że chcesz, przynajmniej na macOS, '... | xargs 'ls' -Gdl' - ktoś inny może sprawdzić, czy to działa również na Linuksie? – ELLIOTTCABLE

12

wierzę git ls-tree --name-only [branch] zrobi to, czego szukasz.

+1

Dzięki, to jest 95% drogi. Twoje 'git ls-tree --name-only [gałąź]' wyświetla zarówno katalogi, jak i pliki z tej samej listy (tzn. Bez końcowych '/' dla katalogów). Znalazłem 'git ls-tree -d --name-only [gałąź]' wyświetli tylko katalogi. Część "problemu" polega na wykrywaniu katalogów submodułów. –

+0

To prawdopodobnie powinna być zaakceptowana odpowiedź! To, lub jest to bardzo dobry początek w kierunku jednego. : D – ELLIOTTCABLE

+0

@PhilipOakley Próbowałem zrobić coś podobnego, z wyjątkiem 'git ls-files' zamiast' git ls-tree'. W przypadku 'git ls-files' wygląda na to, że odpowiednikiem jest' --directory' (w tym poleceniu '-d' jest skrótem od' --deleted'). –

3

po prostu listę plików w bieżącym katalogu roboczym, które są śledzone przez git, Okazało się, że po to kilka razy szybciej niż przy użyciu git ls-tree...:

ls | grep -f <(git ls-files) 

zajęłoby trochę bawić z sed czy też chciał to katalogi, coś wzdłuż linii:

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq) 

zakładając, że w nazwach plików nie ma żadnych znaków "/". Jak również ...

ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)

aby również listy „niewidzialne” (jeszcze śledzone) plików.

+0

To jest miłe ... Zastanawiam się, dlaczego nie mogę dodać go jako '[alias]' ?? 'ls-tracked ="! f() {ls | grep -f <(git ls-files | sed 's /\/.*// g' sort | uniq);}; f "' -> 'fatal: zły plik konfiguracyjny' –

4

git ls-tree <tree-ish> jest dobry i wszystko, ale nie mogę dowiedzieć się, jak określić indeks jako <tree-ish>. (Chociaż jestem pewien, że nie wiąże się kilka all-caps odwoływać się właśnie do tego.)

Przeczą ls-files domyślnie działa na indeksie więc równie dobrze mogę użyć tego:

$ git ls-files | cut -d/ -f1 | uniq 

to pokazuje pliki i katalogi tylko w bieżącym katalogu.

Zmień cut „s -f argumentem do kontrolowania głębi. Na przykład, -f-2 (to kreska dwa) pokazuje pliki i katalogi do dwóch poziomach głęboka

$ git ls-files | cut -d/ -f-2 | uniq 

Jeśli podasz <path> argument ls-files, upewnij się, aby zwiększyć -f aby pomieścić prowadzące katalogi:

$ git ls-files foo/bar | cut -d/ -f-3 | uniq 
+0

Możesz uzyskać drzewo dla indeksu za pomocą ['git write-tree'] (https://git-scm.com/docs/git-write-tree). – jthill

0

Jestem zaskoczony tak jest ciężko ... ale nie każ mi mówić o moim griping około git.

wariantu odpowiedzi jthill wydaje się być aliasable (hej, jestem lingwista, mam licencję na sporządzanie nowych słów).Wariant jest

ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"` 

wykorzystuje ten 'ls formatować dane wyjściowe, więc masz kolor kodowanie (jeśli używasz tego), itd. To działa również jako alias:

alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`' 

FWIW, możesz również aliasować polecenie rekursywne, aby użyć formatowania "ls" (np. jeśli twoja ścieżka + nazwy plików nie są zbyt długie, otrzymasz dwa wyjścia kolumnowe, kodowanie kolorami plików wykonywalnych itp.)

alias gitls-r='ls `git ls-files`' 
Powiązane problemy