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.

użytkownik880954
źródło
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
  1. Edytuj, .gitignoreaby dopasować plik, który chcesz zignorować
  2. git rm --cached /path/to/file

Zobacz też:

Matt Ball
źródło
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!

Jonathan Callen
źródło
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/

ben.tiberius.avery
źródło
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

Théo Attali
źródło
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 $_ }
Chris Pfohl
źródło
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.

Kalyan Chakravarthi V.
źródło