Całkowicie usuń pliki z Git repo i remote na GitHub

Przypadkowo dodałem folder z obrazkami i zrobiłem. Potem zrobiłem jeszcze jedno zobowiązanie. Następnie usunąłem te pliki za pomocą git rm -f ./images i zatwierdziłem ponownie.

W tej chwili zrobiłem o wiele więcej commitów w tej gałęzi (master). W głowie nie mam tego ./static/images folderu.

Z tego powodu, mój rozmiar repo znacznie się zwiększył. Jak mogę całkowicie usunąć te plamy? I chcę go usunąć z mojego zdalnego repo GitHub.
Author: Nick Volynkin, 2011-04-06

3 answers

To jest to, czego szukasz: ignorowanie nie usuwa pliku . Sugeruję przeczytanie tej strony, ale oto konkretne polecenie do użycia:

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Ponadto, aby usunąć wszystkie usunięte pliki z pamięci podręcznej, użyj:

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune

Możesz znaleźć więcej informacji o ostatnim poleceniu, a także skrypt, który robi wszystko, co chcesz w jednej akcji, tutaj: git: forever Usuń pliki lub foldery z historii .

Inne linki z wieloma wyjaśnieniami: Usuń poufne dane.

[Edit] Zobacz także to pytanie StackOverflow: Usuń poufne pliki i ich commity z historii Gita .

(polecenia skopiowane z odpowiedzi natacado w powyższym pytaniu.) Jeśli pliki zostały już usunięte z kopii roboczej, poniższe powinny działać. Znajdź hash dla commita, który dodał niechciane pliki. Więc zrób:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
 124
Author: Darhuuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:13

Możesz po prostu zmienić nazwę swojej gałęzi i usunąć zarówno commit, który dodał obrazy, jak i commit, który je usunął.

git rebase -i master

Zostanie wyświetlona lista commitów. Usuń linie, które mają commity rogue, które chcesz usunąć. ("dd" usuwa wiersz w Vimie, domyślnym edytorze. Następnie zapisz za pomocą ZZ)

Zwisające commity zostaną następnie wyczyszczone w trakcie naturalnego garbage collection Gita, procesu, który możesz wymusić za pomocą polecenia podanego w Darhuuk ' s odpowiedz.

Edit: będzie to działać nawet, jeśli został wciśnięty do zdalnego repozytorium, ale będziesz musiał wcisnąć --force. (To samo dotyczy rozwiązania Git filter-branch).

Zauważ, że będzie to bardzo irytujące dla każdego, kto wyciągnął z Twojej gałęzi. Powinni skonsultować się z "odzyskiwanie z upstream rebase" .


Prawdopodobnie twoje oryginalne przypadkowe dodanie obrazów jest częścią zobowiązania, które chcesz zachować. W takim przypadku musisz edytować commit podczas rebase, aby rozdzielić części, które chcesz zachować. Możesz to zrobić, zastępując "pick" na liście" rebase-i "na" e " (dla edycji). Proces rebase zatrzyma się tutaj i możesz podzielić commit za pomocą "git commit --amend".

 9
Author: RJFalconer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-20 08:33:24

Zasadniczo powtarzam odpowiedźw połączeniu z tym zastrzeżeniem formatowania systemu Windows, tylko po to, aby nie zgubić się jako komentarz.

Zwróć uwagę na użycie cudzysłowów podwójnych zamiast pojedynczych, ponieważ to zależy od powłoki, której używasz, jak przetwarzane są łańcuchy.

Pojedyncza Linia:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

Wiele Linii:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD
 3
Author: drzaus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:00