.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ć?

Madhur Ahuja
źródło
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)

manojlds
źródło
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
KingCrunch
źródło
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
slal
źródło
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ć

Emanuele
źródło
.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

sehe
źródło
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.

Popiół
źródło