Git: wyświetla tylko pliki „nieśledzone” (także niestandardowe polecenia)


339

Czy istnieje sposób użycia polecenia, takiego jak git ls-fileswyświetlanie tylko nieśledzonych plików?

Pytam o to, ponieważ używam następującego polecenia do przetwarzania wszystkich usuniętych plików:

git ls-files -d | xargs git rm

Chciałbym coś podobnego dla nieśledzonych plików:

git some-command --some-options | xargs git add

Byłem w stanie znaleźć -oopcję git ls-files, ale to nie jest to, czego chcę, ponieważ pokazuje również ignorowane pliki. Byłem także w stanie wymyślić następujące długie i brzydkie polecenie:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Wygląda na to, że musi istnieć lepsze polecenie, którego mogę tu użyć. A jeśli nie, to jak mogę utworzyć niestandardowe polecenia git?


Czy mógłbyś wyjaśnić, dlaczego potrzebujesz git ls-files -d | xargs git rm?
— bierze

To usuwa wszystkie pliki, których brakuje powiadomień git. Moje pytanie dotyczyło sposobu wykonania powiązanej operacji - dodaj wszystkie pliki, których git obecnie nie śledzi. Zazwyczaj robiłbym oba po zmianie nazwy, połączeniu i / lub podzieleniu plików kodu.
— We Are All Monica

Jeśli ich brakuje, to czy nie zostały już usunięte? Chyba że ... wyciągnąłeś się gdzieś indziej, a potem próbujesz zsynchronizować się z pilotem ... Myślę, że rozumiem.
— Buttle Butkus,

Przetestowałem wszystkie odpowiedzi, jeśli jest pusty folder bez śledzenia, nikt go nie może znaleźć.
— Kittygirl

@ Kittygirl to jest poprawne. Ponieważ gitdziała tylko na pliki, nie ma możliwości śledzenia pustych folderów. Spróbuj find . -type d -emptyzamiast tego.
— We Are All Monica

Odpowiedzi:


529

Aby wyświetlić listę nieśledzonych plików, spróbuj:

git ls-files --others --exclude-standard

Jeśli chcesz przesłać dane wyjściowe xargs, dobrze jest pamiętać o białych znakach, używając git ls-files -zi xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Niezły alias do dodawania nie śledzonych plików:

au = !git add $(git ls-files -o --exclude-standard)

Edycja: Dla odniesienia: git-ls-files


7
Doskonały! Co !znaczy na początku linii aliasu lub gdzie to jest udokumentowane?
— We Are All Monica

@takeshin Jak uzyskać tylko nazwy katalogów nadrzędnych? nie podfoldery. Środki w tych nieśledzonej plików: / P / A / pliki / P / A / obrazy / P / A / / P / ... - Chcę tylko lista / P /
— Dr.jacky

2
W jakiej sytuacji potrzebujesz aliasu? git add *zrobi to samo: dodaj wszystkie nieśledzone pliki oprócz standardowego (pliki, których ścieżki są objęte .gitignore).
— toinetoine

1
Wolę, aby mój alias działał konsekwentnie we wszystkich katalogach repozytorium (polecenie ls-files pokazuje tylko zmienione pliki w bieżącym drzewie), więc mam[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
— qneill

Dzięki. Dobry komentarz
— Darth Egregious

71

Jeśli chcesz tylko usunąć nieśledzone pliki, wykonaj następujące czynności:

git clean -df

dodaj xdo tego, jeśli chcesz również dołączyć specjalnie zignorowane pliki. Używam git clean -dfxsię wiele w ciągu dnia.

Możesz stworzyć niestandardowy git, po prostu pisząc skrypt o nazwie git-whateveri mając go na swojej drodze.


O wiele bardziej powszechne jest to, że chcę dodawać wszystkie nieśledzone pliki (na przykład po przeniesieniu niektórych rzeczy). W każdym razie dzięki za poradę na temat niestandardowych poleceń. Gdzie jest udokumentowany ten mechanizm?
— We Are All Monica

5
Po prostu zrób git add -Alub git add -u(w zależności od tego, co ma dla ciebie większy sens)
— Dustin

1
Twój komentarz jest prawdziwą odpowiedzią, którą również powtórzył później @Mike Lococo
— andho

2
i „git clean -dfxn” na sucho, dodając „n”
— charo

50

git add -A -nzrobi co chcesz. -Adodaje wszystkie nieśledzone pliki do repozytorium, -nczyni to miejsce, w dry-runktórym dodawanie nie jest wykonywane, ale podaje się dane wyjściowe statusu z listą każdego pliku, który zostałby dodany.


7
To świetna odpowiedź! Zauważ, że wyklucza pliki w .gitignoreplikach, co zwykle jest tym, czego chcemy, ale jeśli nie git add -fAn,.
— cdunn2001

1
To wydaje się najlepszą odpowiedzią.
— Rob Grant,

1
To najlepsza odpowiedź. Wyraźnie mówi użytkownikowi, co by zrobił (bez robienia tego) i daje szansę na sprawdzenie go przed faktycznym dodaniem. Doskonały. Dzięki!
— digitguy

Zawiera również listę zmodyfikowanych plików.
— Frank-Rene Schäfer

ładne, ale pojawia się on zawinięty: add '$file'. Podczas gdy git ls-files --exclude-standard -odaje gołe wyjście, gorące rurki.
— hyperpallium

28

Akceptowana odpowiedź ulega awarii w nazwach plików ze spacją. Nie jestem w tej chwili pewien, jak zaktualizować polecenie aliasu, więc umieszczę tutaj ulepszoną wersję:

git ls-files -z -o --exclude-standard | xargs -0 git add

Myślę, że to poprawna odpowiedź, ponieważ zawiera ścieżkę każdego pliku do wykonania na nich później akcji (np. Git add)
— Pablo Burgos

27

Wszystko jest bardzo proste

Aby uzyskać listę wszystkich nie śledzonych plików, użyj polecenia git status z opcją -u (--untracked-files)

git status -u

co powiesz na nierekurencyjną wersję tego?
— David

Niestety wyświetla również listę plików ignorowanych przez pliki .gitignore.
— Plouff

8
To jedyna odpowiedź, która pokazała moje zignorowane pliki przy pierwszym zatwierdzeniu, ale musiałem dodać --ignoreddo git status -upolecenia
— DN

To jest proste i miłe.
— Eric Wang

1
To także pokazuje zmodyfikowane pliki. Tak więc, nie odpowiedź na pytanie: pokaż tylko nieśledzone pliki.
— Wildcard

6

Podczas wyszukiwania plików, które potencjalnie można dodać. Wynika z git showtego, ale zawiera również wiele innych rzeczy. Poniższe polecenie jest przydatne, aby uzyskać tę samą listę plików, ale bez wszystkich innych rzeczy.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Jest to przydatne w połączeniu z potokiem w celu znalezienia plików pasujących do określonego wzorca, a następnie przesłania go do potoku git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

Wiem, że to stare pytanie, ale jeśli chodzi o listę nieśledzonych plików, pomyślałem, że dodam jeszcze jedno, które zawiera także listy nieśledzonych folderów:

Możesz użyć operacji git clean z opcją -n (suchy bieg), aby pokazać, które pliki zostaną usunięte (w tym pliki .gitignore) przez:

git clean -xdn

Ma to tę zaletę, że pokazuje wszystkie pliki i wszystkie foldery , które nie są śledzone. Parametry:

  • x - Pokazuje wszystkie nieśledzone pliki (w tym ignorowane przez git i inne, takie jak kompilacja itp.)
  • d - pokaż nieśledzone katalogi
  • n- i co najważniejsze! - dryrun, tzn. nie usuwaj niczego, po prostu użyj czystego mechanizmu do wyświetlenia wyników.

Może to być trochę niebezpieczne, aby zrobić to w ten sposób, jeśli zapomnisz -n. Więc zazwyczaj pseudonim to w git config.


2

Wszystkie poprzednie odpowiedzi, które sprawdziłem, również zawierają listę plików do zatwierdzenia. Oto proste i łatwe rozwiązanie, które wyświetla tylko te pliki, które nie są jeszcze w repozytorium i nie podlegają .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

lub

git status --porcelain | grep -v '\?\?'

wydaje się, że nie działa to dobrze z plikami, które mają spacje w nazwie
— ssc

-2

Myślę, że będzie tak samo, jak zamierzał oryginalny plakat:

git add .


2
Za każdym razem, gdy to robisz git/svn add ., kotek umiera.
— Nakilon

Heh, tylko jeśli masz kilka cruft w lokalnych kopiach odległych oddziałów;) Twórz lokalne oddziały i możesz git add .bezkarnie!
— Tim Fulmer,

@Nakilon, dlatego .gitignorepoprawnie się konfigurujesz . Nadal jednak warto go unikać git add .. Lepsze jest git add -u.
— Wildcard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.