.gitignore po zatwierdzeniu


210

Mam repozytorium git hostowane na Github. Po popełnieniu wielu plików, mam świadomość, że muszę stworzyć .gitignorei uwzględniają .exe, .objplików.

Czy jednak automatycznie usunie te zatwierdzone pliki z repozytorium? Czy jest jakiś sposób, aby to wymusić?


6
Przyszli pracownicy Google mogą uznać to za niezwykle przydatne. Zwięzłe i na temat: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean

Odpowiedzi:


331

Nie, nie można wymusić usunięcia pliku już zatwierdzonego w repozytorium tylko dlatego, że jest on dodany do pliku .gitignore

Musisz git rm --cachedusunąć pliki, których nie chcesz w repozytorium. (- buforowane, ponieważ prawdopodobnie chcesz zachować lokalną kopię, ale usunąć z repozytorium). Więc jeśli chcesz usunąć wszystkie pliki exe z repo, wykonaj

git rm --cached /\*.exe

(Zauważ, że gwiazdka * jest cytowana z powłoki - pozwala to git, a nie powłoce, rozwinąć ścieżki do plików i podkatalogów)


6
@Madhur Ahuja Właściwie jeśli to zrobisz git rm /\*.exe, usuniesz wszystkie pliki exe z twojego repo
manojlds

4
Po co są /?
Costa

5
@Costa są tam, aby uciec od gwiazdki, aby zapobiec interpretacji jej przez powłokę, zgodnie z przeznaczeniem git.
Lambart

2
Ostrzeżenie: pliki są przechowywane lokalnie, to prawda ... Ale inni użytkownicy uruchomieni git pullzobaczą, że ich pliki zostaną usunięte.
ByScripts,

42

Czy jednak automatycznie usunie te zatwierdzone pliki z repozytorium?

Nie. Nawet przy istniejącym pliku .gitignoremożesz zignorować pliki zignorowane za pomocą -fflagi (force). Jeśli pliki są już zatwierdzone, nie zostaną automatycznie usunięte.

git rm --cached path/to/ignored.exe

Czy to oznacza, że ​​usunąłem indywidualnie każdy plik .exe
Madhur Ahuja

Prawdopodobnie możesz to zrobić wsadowo, ale nie wiem, jak to działa pod oknami
KingCrunch

30

Jeśli zmiany nie zostały jeszcze wprowadzone:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push

15

Musiałem usunąć .idea i foldery docelowe, a po przeczytaniu wszystkich komentarzy to zadziałało dla mnie:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

a następnie naciśnij, aby opanować


.ideato był mój problem. Myślę, że to też był twój:)
Olivier Pons,

5

Czy jednak automatycznie usunie te zatwierdzone pliki z repozytorium?

Nie.

„Najlepszym” sposobem na zrobienie tego jest użycie, git filter-branchjak napisano tutaj:

Strona podręcznika dla git-filter-branch zawiera wyczerpujące przykłady.

Uwaga Będziesz ponownie pisać historię. Jeśli opublikowałeś jakiekolwiek poprawki zawierające przypadkowo dodane pliki, może to powodować problemy dla użytkowników tych publicznych oddziałów. Poinformuj ich, a może pomyśl o tym, jak bardzo musisz usunąć pliki.

Uwaga W obecności tagów zawsze używaj --tag-name-filter catopcji do git filter-branch. Nigdy nie boli i oszczędza ci bólu głowy, gdy później uświadomisz sobie, że potrzebujesz go


Uruchomiłem to polecenie, pokazało Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) OSTRZEŻENIE: Ref 'refs / heads / master' jest niezmieniony i nic się nie stało
Madhur Ahuja

Jest to ostrzeżenie i najprawdopodobniej oznacza, że ​​gałąź główna nie zawierała (jeszcze) żadnych poprawek do plików, które należy usunąć. Możesz to łatwo sprawdzić. Jeśli występuje problem, zaktualizuj pytanie. PS: użyj - --allaby przepisać wszystkie (lokalne) gałęzie jednocześnie
patrz

1

Nawet po usunięciu pliku (plikach), a następnie zatwierdzeniu, nadal będziesz mieć te pliki w historii. Aby je usunąć, rozważ użycie BFG Repo-Cleaner . Jest to alternatywa dla git-filter-branch.

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.