git: Jak zignorować wszystkie obecne nieśledzone pliki?

132

Czy istnieje wygodny sposób na zignorowanie wszystkich nieśledzonych plików i folderów w repozytorium git?
(Wiem o .gitignore.)

Więc git statusponownie zapewni czysty wynik.

sjas
źródło
Możesz też dodać pojedynczy znak * do pliku .gitignore. :)
vilicvane
1
Tylko *wola najprawdopodobniej nie będzie tym, czego chcesz.
sjas
Zaskoczony tyloma błędnymi odpowiedziami. -u nojest źle. -unojest poprawne. -u nopróbuje nadać status pliku o nazwie no! noTo nie argument -u. Aby wymusić nointerpretację jako argument -u, nie może być spacji. Aby to przetestować, zrób touch Invalidi porównaj git status -uInvalidz git status -u Invalid.
Aaron McDaid

Odpowiedzi:

259

Jak już powiedziano, aby wykluczyć ze statusu, użyj:

git status -uno  # must be "-uno" , not "-u no"

Jeśli zamiast tego chcesz trwale zignorować aktualnie nieśledzone pliki, możesz z poziomu katalogu głównego swojego projektu uruchomić:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Każde kolejne wywołanie git statusjawnie zignoruje te pliki.

AKTUALIZACJA : powyższe polecenie ma niewielką wadę: jeśli nie masz .gitignorejeszcze pliku, Twój gitignore zignoruje się! Dzieje się tak, ponieważ plik .gitignorejest tworzony przed git status --porcelainwykonaniem. Jeśli więc nie masz .gitignorejeszcze pliku, polecam użycie:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Spowoduje to utworzenie podpowłoki, która kończy się przed utworzeniem .gitignorepliku.

WYJAŚNIENIE POLECENIA, ponieważ otrzymuję dużo głosów (dziękuję!) Myślę, że lepiej trochę wyjaśnię polecenie:

  • git status --porcelainjest używany zamiast, git status --shortponieważ ręczne stany "Przekaż wynik w łatwym do przeanalizowania formacie dla skryptów. Jest to podobne do krótkiego wyniku, ale pozostanie stabilne w wersjach git i niezależnie od konfiguracji użytkownika." Mamy więc zarówno parsowalność, jak i stabilność;
  • grep '^??'filtruje tylko te linie zaczynające się od ??, które zgodnie z podręcznikiem statusu git , odpowiadają nieśledzonym plikom;
  • cut -c4- usuwa pierwsze 3 znaki z każdego wiersza, co daje nam tylko względną ścieżkę do nieśledzonego pliku;
  • gdy |symbole są rury , które przechodzą wyjście poprzedniego polecenia do wejścia następnego polecenia;
  • >>i >symbole są operatory przekierowania , które dołączyć wyjście poprzedniego polecenia do pliku lub nadpisów / tworzy nowy plik, odpowiednio.

KOLEJNY WARIANT dla tych, którzy wolą używaćsed zamiast, grepa cutoto inny sposób:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
Diego
źródło
3
cut -c4- usuwa pierwsze 4 znaki z każdego wiersza, co daje nam tylko względną ścieżkę do nieśledzonego pliku; Nie -coznacza początek listy numerów kolumn do wycięcia. I 4- wybiera linię od kolumny 4 do końca, która przecina kolumny 1-3. Więc twoja komenda cut faktycznie usuwa pierwsze 3 znaki z każdego wiersza. Jeśli usunąłeś 4 znaki z wiersza statusu git, takiego jak ten dla tego pliku tutaj ?? app/views/static_pages/contact.html.erb:, należy usunąć pierwszą literę app. Więc polecenie jest poprawne, ale wyjaśnienie jest błędne.
7stud
@ 7stud: dziękuję, masz rację, 4 przez pomyłkę napisałem. Naprawiłem odpowiedź.
Diego
2
Naprawdę doceniam wyjaśnienie polecenia. Miło jest wiedzieć, co robią losowe polecenia skopiowane z Internetu i pomaga nam wszystkim nauczyć się lepiej korzystać z wiersza poleceń i gita.
Eric Fitting
1
-u nonie działa dla mnie. Ale -unotak. Odpowiednio zaktualizowałem odpowiedź. To dziwny projekt dla gita. Jestem na git 1.7.1
Aaron McDaid
2
@AaronMcDaid: dzięki. Zmiana jest udokumentowana tutaj i omówiona tutaj
Diego
53

Jeśli chcesz trwale zignorować te pliki, prostym sposobem ich dodania .gitignorejest:

  1. Zmień na katalog główny drzewa git.
  2. git ls-files --others --exclude-standard >> .gitignore

Spowoduje to wyliczenie wszystkich plików w nieśledzonych katalogach, które mogą, ale nie muszą, być tym, czego chcesz.

bilard
źródło
4
Dlaczego to nie daje tylu głosów? Nie ma potrzeby przechodzenia przez 2 inne programy!
JoelFan
6
@JoelFan: dwa powody: 1) ten działa tylko z katalogu głównego gita , podczas gdy zaakceptowany działa z każdego podkatalogu, wystarczy dostosować .gitignoreścieżkę docelową 2) jeśli masz katalog bez śledzenia, ten wyświetla każdy i każdy plik w nim, ale nie sam nieśledzony katalog (więc nie zignorujesz katalogu, a tym samym nadal będziesz zgłaszać przyszłe pliki w katalogu jako nieśledzone, podczas gdy zaakceptowany wyświetla tylko katalog, a nie nieśledzone pliki wewnątrz . To kwestia tego, co chcesz robić, ale często chcesz po prostu zignorować cały reż.
Diego
1
Dziękuję Poolie. Doceniam różnicę w twoich sugestiach ze względu na punkty wspomniane przez @Diego. Zacząłem pracować z biblioteką plików i folderów i nie chcę śledzić / przesyłać oryginalnych plików. Chcę tylko śledzić pliki, które dodam lub odbuduję w bibliotece. Dodanie folderów nadrzędnych spowodowałoby zignorowanie wszystkiego. To / Twoje rozwiązanie dodało wszystkie 1696 plików w mgnieniu oka. xD
Chaos7703
Można to również osiągnąć za pomocą git config status.showUntrackedFiles no.
larsch
16

Znalazłem to w instrukcji

Parametr mode służy do określania obsługi plików bez śledzenia. Jest opcjonalna: domyślnie all, a jeśli została określona, ​​musi zostać przypisana do opcji (np. -Uno, ale nie -u no).

git status -uno

sjas
źródło
41
Cóż, gdyby wszyscy przed wysłaniem postu RTFM, nikt z nas nie otrzymałby żadnego przedstawiciela :-)
Jenny D,
4

Dwie drogi:

użyj argumentu „-uno” do git-status. Oto przykład:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Lub możesz dodać pliki i katalogi do .gitignore, w takim przypadku nigdy się nie pojawią.

Jenny D.
źródło
2
Poręczny sposób edytowania .gitignoreistoty git status | cat >> temp && vim temp. Następnie edytuj plik, aby usunąć kilka pierwszych wierszy i ostatnią linię, a także końcowe #i białe spacje po nich. Wtedy cat temp >> .gitignore && rm temp. Jeśli nie .gitignorebyło wcześniej, mv temp .gitignorezrobi. Brzydkie rzeczy, ale lepsze niż .gitignoreręczne aktualizowanie .
sjas
1
Ta odpowiedź jest nieprawidłowa. Prawidłowa odpowiedź brzmi -uno. Jeśli używasz -u no, jest równoważne no -u- zrobi status na pliku o nazwie no(który prawdopodobnie nie istnieje) i użyje -utrybu domyślnego . czyli jest to odpowiednikgit status no
Aaron McDaid
3

-u nonie pokazuje również plików niestacjonarnych. -unodziała zgodnie z oczekiwaniami i wyświetla się bez sceny, ale ukrywa się bez śledzenia.

piłka nożna
źródło
1
Nawet to nie jest do końca poprawne. git status -u Xjest równoważne git status X -u( Xnie jest argumentem do -u). To z kolei jest równoważne z git status X(ponieważ -ubez argumentu jest to ustawienie domyślne -u). Dlatego jest to po prostu status git w pliku X. Tak więc, jeśli Xjest noto po prostu stara się zrobić git status na plik o nazwie no, której prawdopodobnie nie masz
Aaron McDaid
2

W przypadku, gdy nie są na Unix jak OS, to będzie działać na systemie Windows za pomocą PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Jednak .gitignoreplik musi mieć nową pustą linię, w przeciwnym razie doda tekst do ostatniej linii, bez względu na to, czy będzie zawierała zawartość.

To może być lepsza alternatywa:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

vhanla
źródło
1

Jeśli masz dużo plików nieśledzonej i nie chce „ gitignore” wszyscy pamiętać, że, ponieważ git 1.8.3 (kwiecień 2013), 22d , git statuswspomnę --untracked-files=nonawet jeśli nie dodać, że opcja w pierwsze miejsce!

git status” sugeruje użytkownikom skorzystanie z --untracked=noopcji, gdy trwa to zbyt długo.

VonC
źródło
0

Przyjechałem tutaj, próbując rozwiązać nieco inny problem. Może przyda się to komuś innemu:

Tworzę nowy oddział feature-a. w ramach tej gałęzi tworzę nowe katalogi i muszę zmodyfikować .gitignore, aby usunąć niektóre z nich. Dzieje się tak często podczas dodawania nowych narzędzi do projektu, które tworzą różne foldery pamięci podręcznej. .serverless, .terraformItp

Zanim będę gotowy do scalenia tego z powrotem do mastera, pojawiło się coś innego, więc masterponownie sprawdzam , ale teraz ponownie git statuspodnoszę te wyłączone foldery, ponieważ .gitignore nie zostało jeszcze scalone.

Odpowiedź tutaj jest właściwie prosta, chociaż musiałem znaleźć tego bloga, aby to rozgryźć:

Po prostu pobierz plik .gitignore z feature-aoddziału

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
William George
źródło