Stosowanie .gitignore do zatwierdzonych plików


436

Popełniłem mnóstwo plików, które chcę teraz zignorować. Jak mogę powiedzieć gitowi, aby teraz ignorował te pliki z przyszłych zatwierdzeń?

EDYCJA: Chcę je również usunąć z repozytorium. Są to pliki tworzone po każdej kompilacji lub w celu wsparcia narzędzi dla użytkownika.


1
możliwy duplikat pliku
.gitignore

8
@Wooble Odpowiedź może być podobna, ale to pytanie dokładnie opisuje problem, z którym się spotkałem i musiałem go rozwiązać.
rjmunro

1
Oto odpowiedź, która bezpośrednio odnosi się do pytania tytułowego z minimalnymi zmianami w repozytorium git: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Odpowiedzi:


471

12
Istnieje jednak wiele plików. Nie chcę tego robić dla każdego użytkownika
user880954

1
Czy pliki znajdują się w jakichś popularnych katalogach? Jeśli nie, problem sprowadza się do pytania o użycie powłoki, a nie do git.
Matt Ball

12
Musi istnieć tryb „Zapomniałem dodać mój .gitignore, aż do mojego początkowego zatwierdzenia”.
Luke Puplett

9
Odpowiedź jest poniżej tego.
Lopsided

3
Poprosił mnie o dodanie flagi -r, aby móc to zrobić.
Vishal Gulati,

599

Po edycji, .gitignoreaby dopasować zignorowane pliki, możesz zrobić, git ls-files -ci --exclude-standardaby zobaczyć pliki, które znajdują się na listach wykluczeń; możesz wtedy zrobić

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

usunąć je z repozytorium (bez usuwania ich z dysku).

Edycja : Możesz również dodać to jako alias w pliku .gitconfig, abyś mógł go uruchomić w dowolnym momencie. Po prostu dodaj następujący wiersz w sekcji [alias] (zmodyfikuj w razie potrzeby w systemie Windows lub Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(The -r Flaga in xargszapobiega git rmuruchomieniu na pustym wyniku i wydrukowaniu komunikatu o jego użyciu, ale może być obsługiwana tylko przez GNU findutils. Inne wersje xargsmogą, ale nie muszą, mieć podobną opcję.)

Teraz możesz po prostu wpisać git apply-gitignoreswoje repozytorium, a zrobi to za Ciebie!


10
Myślę, że xargs na Maca nie ma -r ... lub mój jest wadliwy / stary, nie wiem ... i dlaczego !wcześniej git? cóż ... mój pracował jako alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino,

18
W systemie Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett

To właśnie usunęło moje pliki .gitignore, a nie pliki, które chciałem zignorować, które były wymienione w plikach .gitignore - czy o to chodziło?
Hippyjim

@Hippyjim, jeśli pliki są już zatwierdzone (nawet jeśli były wymienione w .gitignore), a .gitignore nie jest jeszcze zatwierdzone, to byłby to oczekiwany wynik, w przeciwnym razie nie jestem pewien, co się dzieje w twoim przypadku.
Jonathan Callen

1
Dla użytkowników komputerów Mac -rjest domyślny i nie jest akceptowany przez wersje BSD. Więc usuń -r.
Weishi Zeng

136

pozostawić plik w repozytorium, ale zignorować przyszłe zmiany:

git update-index --assume-unchanged <file>

i cofnąć to:

git update-index --no-assume-unchanged <file>

aby dowiedzieć się, które pliki zostały ustawione w ten sposób:

git ls-files -v|grep '^h'

podziękowania za oryginalną odpowiedź na http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
Chronial ma świetną odpowiedź na robienie tego rekurencyjnie dla katalogu: stackoverflow.com/a/16346756/1101076
jordan314

Chciałem zatwierdzić konfigurację IDE, ale nie śledzić niepotrzebnych zmian. To działa, choć nie jestem pewien, czy zadziała dla innych, którzy sprawdzą repozytorium. Można to połączyć, git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedjeśli to pomaga.
dlamblin,

7
To jedyna odpowiedź, która dokładnie odpowiada pytaniu tytułowemu. DOSKONAŁY! Większość tych innych odpowiedzi niepotrzebnie zadzierała z plikami.
kayleeFrye_onDeck

1
To jest dokładnie właściwa odpowiedź na pytanie. Użycie poleceń typu „ git rm --cachedusunie” plik z repozytorium, co nie zaspokoi potrzeby quizera. Dziękuję Ci. Bardzo to doceniam. Twoja odpowiedź bardzo mi pomaga.
ramwin

88

Upewnij się, że Twoje repozytorium jest najnowszą wersją

  1. Edytuj, .gitignorejak chcesz
  2. git rm -r --cached .
  3. git add .

następnie popełnij jak zwykle


14
To powinna być zaakceptowana odpowiedź, ponieważ pytanie wyraźnie mówiło, że jest wiele plików do usunięcia.
nbeuchat

3
Pamiętaj, że krok 2 może zająć trochę czasu, jeśli masz duże repozytorium.
brainbag

Doprowadziło to do usunięcia wszystkich plików z indeksu! To mnie uratowało: git reset HEAD(Pamiętaj, aby ukryć wszelkie zmiany)
aksh1618

2
Krok 2 usuwa wszystko, tak, ale krok 3 powinien przeczytać je wszystkie, z wyjątkiem tych, które zawiodły z powodu .gitignore.
ojchase

11

Stare pytanie, ale niektórzy z nas są w git-posh(PowerShell). Oto rozwiązanie tego problemu:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

Wykonaj następujące kroki:

  1. Dodaj ścieżkę do gitignorepliku

  2. Uruchom to polecenie

    git rm -r --cached foldername
    
  3. zatwierdzaj zmiany jak zwykle.

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.