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?

Wszyscy jesteśmy Monicą
źródło
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

zabiera
źródło
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.

Dustin
źródło
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.

Mike Lococo
źródło
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
youurayy
źródło
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
Valentyna
źródło
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
cmac
źródło
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.

pokarm_kodowy
źródło
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 '\?\?'
Frank-Rene Schäfer
źródło
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 .

Tim Fulmer
źródło
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