Zastosuj .gitignore w istniejącym repozytorium, które już śledzi dużą liczbę plików

314

Mam istniejący projekt Visual Studio w moim repozytorium. Niedawno dodałem plik .gitignore do mojego projektu i zakładam, że mówi Gitowi, aby zignorował pliki wymienione w tym pliku.

Mój problem polega na tym, że wszystkie te pliki są już śledzone i, o ile wiem, Git nie zignoruje pliku, który był już śledzony przed dodaniem reguły do ​​tego pliku, aby go zignorować.

Sugerowano użycie: git rm --cachedi ręcznego ich wyśledzenia, ale zajmie mi to wieczność, aby przejrzeć je jeden po drugim.

Pomyślałem o usunięciu repozytorium i ponownym jego utworzeniu, ale tym razem z obecnym plikiem .gitignore, ale musi być lepszy sposób, aby to zrobić.

Tohid
źródło
1
możesz git rm --cachedcałe katalogi z -ropcją, jeśli jest to pomocne
Nathan Wallace
Zobacz także: Wyodrębnij pliki z Gita
Patrick James McDougle

Odpowiedzi:

870

Ta odpowiedź rozwiązała mój problem:

Po pierwsze, zatwierdź wszystkie oczekujące zmiany.

Następnie uruchom to polecenie:

git rm -r --cached .

Spowoduje to usunięcie wszystkiego z indeksu, a następnie po prostu uruchom:

git add .

Zatwierdź to:

git commit -m ".gitignore is now working"
Tohid
źródło
9
Idealna odpowiedź! Dodaj git push originrównież, aby odzwierciedlić zmiany w zdalnym repozytorium.
Sanket Berde
8
Zacząłem używać tej odpowiedzi ... i usunęło prawie wszystko w moim projekcie! Oczywiście robiłem coś złego. Ale chcę ostrzec ludzi, aby nie podążali za tą sugestią od niechcenia.
Mark Olbert
4
Czy to kończy się utratą historii plików po ich usunięciu i ponownym dodaniu
Aran Mulholland
10
Zastanawiam się, ile zatwierdzeń używa tej .gitignore is now workingwiadomości. :)
ihavenoidea
1
Ta metoda działała dla mnie dobrze. Utworzyłem plik gitignore, zignorowałem cały katalog, a następnie dokonałem zmiany w tworzeniu gitignore. Następnie wykonałem powyższe trzy polecenia dokładnie tak, jak powiedzieli. Działa idealnie, ale powinienem powiedzieć, że najpierw musisz „zatwierdzić wszystkie oczekujące zmiany”, jak stwierdzono powyżej.
Erich Meissner
61
  1. Utwórz plik .gitignore, więc aby to zrobić, po prostu utwórz dowolny pusty plik .txt.

  2. Następnie musisz zmienić jego nazwę, pisząc następujący wiersz na cmd (gdzie git.txtjest nazwa właśnie utworzonego pliku):

    rename git.txt .gitignore

  3. Następnie możesz otworzyć plik i zapisać na stałe wszystkie nieśledzone pliki, które chcesz zignorować. Na przykład mój wygląda następująco:

``

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

GitHub oferuje całą kolekcję przydatnych plików .gitignore

  1. Gdy już to zrobisz, musisz dodać go do repozytorium git, tak jak każdy inny plik, tyle że musi znajdować się w katalogu głównym repozytorium.

  2. Następnie w swoim terminalu musisz napisać następujący wiersz:

    git config --global core.excludesfile ~ / .gitignore_global

Od oficjalnego dokumentu:

Możesz także utworzyć globalny plik .gitignore, który jest listą zasad ignorowania plików w każdym repozytorium Git na twoim komputerze. Na przykład możesz utworzyć plik w ~ / .gitignore_global i dodać do niego kilka reguł.

Otwórz terminal. Uruchom następującą komendę w swoim terminalu: git config --global core.excludesfile ~ / .gitignore_global

Jeśli repozytorium już istnieje, musisz uruchomić następujące polecenia:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Jeśli krok 2 nie działa, powinieneś zapisać ścieżkę do dziury w plikach, które chcesz dodać.

SomeAnonymousPerson
źródło
4
@Karen_Wiznia „git config ... _global” tworzy globalny gitingore dla wszystkich repozytoriów Git na komputerze. PO nie chciał tego robić.
ivan7707,
Chciałbym móc polubić to więcej niż raz, ciągle wracam do tego pytania, szukając tego przypomnienia.
Antony D'Andrea
1
Powinien to być „mv git.txt .gitignore” zamiast „zmień nazwę git.txt .gitignore”.
Ahmad F,
30

Jak określono tutaj Możesz zaktualizować indeks:

git update-index --assume-unchanged /path/to/file

W ten sposób pliki nie będą wyświetlane w git statuslub git diff.

Aby ponownie rozpocząć śledzenie plików, możesz uruchomić:

git update-index --no-assume-unchanged /path/to/file
Patrick James McDougle
źródło
5
To lepsza odpowiedź - koncentruje się tylko na jednym pliku, pliku, którego repozytorium nie chce śledzić. Najwyżej zaznaczona odpowiedź będzie również działać, ale robi znacznie więcej niż ignorowanie pliku ze śledzenia przez git.
Chris Mejka,
1
Ten jest dobry. Ale co jeśli wyciągniemy? Czy są jakieś konflikty scalania?
pramod
@pramod, świetne pytanie. Nie jestem do końca pewny. Wypróbuj w uproszczonym repozytorium testowym?
Patrick James McDougle
15

Jeśli dodasz swój .gitignoreplik za późno, git będzie nadal śledził już zatwierdzone pliki, niezależnie od tego. Aby to naprawić, zawsze możesz usunąć wszystkie buforowane wystąpienia niechcianych plików.

Po pierwsze, aby sprawdzić, jakie pliki faktycznie śledzisz, możesz uruchomić:

git ls-tree --name-only --full-tree -r HEAD

Powiedzmy, że znalazłeś niechciane pliki w takim katalogu cache/, bezpieczniej jest kierować na ten katalog zamiast na wszystkie pliki.

Więc zamiast:

git rm -r --cached .

Bezpieczniej jest kierować na niechciany plik lub katalog:

git rm -r --cached cache/

Następnie dodaj wszystkie zmiany,

git add .

i popełnij ...

git commit -m ".gitignore is now working"

Odniesienie: https://amyetheredge.com/code/13.html

Eli Nunez
źródło
To najlepsza i czysta odpowiedź, jeśli chcesz usunąć tylko kilka plików, a nie całe repozytorium. Podnoszę kciuki do góry.
Apuig,
2

Oto jeden ze sposobów „wyśledzenia” plików, które w innym przypadku zostałyby zignorowane w ramach bieżącego zestawu wzorców wykluczania:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Pozostawia to pliki w katalogu roboczym, ale usuwa je z indeksu.

Sztuczka zastosowana w tym przypadku polega na dostarczeniu nieistniejącego pliku indeksu do plików git ls, aby sądził, że nie ma plików śledzonych. Powyższy kod powłoki pyta o wszystkie pliki, które byłyby ignorowane, gdyby indeks był pusty, a następnie usuwa je z rzeczywistego indeksu za pomocą git rm.

Po „wyśledzeniu” plików użyj statusu git, aby sprawdzić, czy nic ważnego nie zostało usunięte (jeśli tak, dostosuj wzorce wykluczania i użyj git reset - ścieżka, aby przywrócić usunięty wpis indeksu). Następnie dokonaj nowego zatwierdzenia, które pomija „crud”.

„Crud” nadal będzie w jakichkolwiek starych zobowiązaniach. Możesz użyć git filter-branch do stworzenia czystych wersji starych zatwierdzeń, jeśli naprawdę potrzebujesz czystej historii (nb użycie git filter-branch spowoduje „przepisanie historii”, więc nie należy tego podejmować lekko, jeśli masz współpracowników, którzy wyciągnęli którykolwiek z twoich historycznych zobowiązań po wprowadzeniu „surowości” po raz pierwszy).


źródło
brzmi jak solidne rozwiązanie :) Zakładam, że dotyczy to powłoki Linux, prawda? niestety jestem użytkownikiem Win7. W jaki sposób mogę to zrobić w systemie Windows?
Tohid
0

Usuń pliki z obszaru przejściowego

git reset HEAD .

Dodaj wszystkie zmiany

git add .

Zatwierdź to:

git commit -m ".gitignore is now working"
Mahdi Ben Selimene
źródło
-1

Myślę, że jest to łatwy sposób na dodanie pliku .gitignore do istniejącego repozytorium.

Warunek :

Potrzebujesz przeglądarki, aby uzyskać dostęp do konta github.

Kroki

  1. Utwórz nowy plik w wymaganym (istniejącym) projekcie i nazwij go .gitignore . Otrzymasz sugestywny monit dotyczący szablonów .gitignore, gdy tylko nazwiesz ten plik jako .gitignore . Użyj tych szablonów lub użyj gitignore.io, aby wygenerować zawartość pliku gitignore .
  2. Zatwierdź zmiany.
  3. Teraz sklonuj to repozytorium.

Baw się dobrze!

Roshan Poudyal
źródło
-3

Użyj git clean
Uzyskaj pomoc dotyczącą tego biegu

git clean -h

Jeśli chcesz zobaczyć, co stanie się najpierw, upewnij się, że minął przełącznik -n, aby uruchomić na sucho:

git clean -xn

Aby usunąć śmieci gitingnored

git clean -xdf

Uwaga: Być może ignorujesz lokalne pliki konfiguracyjne, takie jak database.yml, które również zostaną usunięte. Używaj na własne ryzyko.

Następnie

git add .
git commit -m ".gitignore is now working"
git push
Nedudi
źródło