Pracowałem nad repozytorium na moim koncie GitHub i na ten problem natknąłem się.
- Projekt Node.js z folderem z zainstalowanymi kilkoma pakietami npm
- Paczki były w
node_modules
folderze - Dodałem ten folder do repozytorium git i przekazałem kod do github (nie myślałem wtedy o części npm)
- Uświadomiłem sobie, że tak naprawdę nie potrzebujesz, aby ten folder był częścią kodu
- Usunąłem ten folder, wypchnąłem go
W tym przypadku całkowity rozmiar repozytorium git wynosił około 6 MB, a rzeczywisty kod (wszystkie oprócz tego folderu) miał tylko około 300 KB .
Teraz w końcu szukam sposobu, aby pozbyć się szczegółów tego folderu pakietu z historii gita, więc jeśli ktoś go sklonuje, nie będzie musiał pobierać historii o wartości 6 MB, z której będą pobierać jedyne rzeczywiste pliki od ostatniego zatwierdzenia wynosiłby 300 KB.
Szukałem możliwych rozwiązań tego problemu i wypróbowałem te 2 metody
- Usuń plik z repozytorium git (historia)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
Wydawało się, że Gist działał, gdy po uruchomieniu skryptu pokazał, że pozbył się tego folderu, a następnie zmodyfikował 50 różnych zatwierdzeń. Ale nie pozwoliło mi to przepchnąć tego kodu. Kiedy próbowałem to przeforsować, napisałem, Branch up to date
ale pokazałem, że 50 zatwierdzeń zostało zmodyfikowanych po git status
. Pozostałe 2 metody też nie pomogły.
Teraz, mimo że pokazało, że pozbył się historii tego folderu, kiedy sprawdziłem rozmiar tego repozytorium na moim lokalnym hoście, nadal miał około 6 MB. (Ja również usunąłem refs/original
folder, ale nie zauważyłem zmiany rozmiaru repozytorium).
Chciałbym wyjaśnić, czy istnieje sposób, aby pozbyć się nie tylko historii zatwierdzeń (co wydaje mi się jedyną rzeczą, która się wydarzyła), ale także tych plików, które git ciągle zakłada, że chce się wycofać.
Powiedzmy, że rozwiązanie zostało przedstawione w tym celu i jest zastosowane na moim lokalnym hoście, ale nie można go odtworzyć w tym repozytorium GitHub, czy można sklonować to repo, przywrócić do pierwszego zatwierdzenia wykonać lewę i wcisnąć (lub czy to oznacza, że git będzie nadal masz historię tych wszystkich zmian? (inaczej 6 MB).
Moim ostatecznym celem jest po prostu znalezienie najlepszego sposobu na pozbycie się zawartości folderu z git, aby użytkownik nie musiał pobierać rzeczy o wartości 6 MB i nadal mógł mieć inne zatwierdzenia, które nigdy nie dotknęły folderu modułów (to całkiem ładnie wiele z nich) w historii gita.
W jaki sposób mogę to zrobić?
źródło
Odpowiedzi:
Jeśli jesteś tutaj, aby skopiować i wkleić kod:
To przykład, który usuwa
node_modules
z historiiCo właściwie robi git:
Pierwszy wiersz iteruje wszystkie odniesienia w tym samym drzewie (
--tree-filter
) co HEAD (twoja aktualna gałąź), uruchamiając polecenierm -rf node_modules
. To polecenie usuwa folder node_modules (-r
bez-r
,rm
nie usuwa folderów), bez monitu dla użytkownika (-f
). Dodane--prune-empty
usuwa bezużyteczne (nic nie zmieniając) zatwierdza rekurencyjnie.Drugi wiersz usuwa odniesienie do tej starej gałęzi.
Pozostałe polecenia są stosunkowo proste.
źródło
git count-objects -v
sprawdzać, czy pliki zostały faktycznie usunięte, ale rozmiar repozytorium pozostaje taki sam, dopóki nie sklonuję repozytorium. Myślę, że Git przechowuje kopię wszystkich oryginalnych plików.--force-with-lease
, nie--force
.Uważam, że
--tree-filter
opcja używana w innych odpowiedziach może być bardzo wolna, szczególnie w przypadku większych repozytoriów z dużą ilością zatwierdzeń.Oto metoda, której używam do całkowitego usunięcia katalogu z historii git przy użyciu
--index-filter
opcji, która działa znacznie szybciej:Możesz sprawdzić rozmiar repozytorium przed i po
gc
:źródło
--quiet
dogit rm
powyższego przyspieszyło moje przepisanie przynajmniej 4 razyOprócz popularnej powyższej odpowiedzi chciałbym dodać kilka uwag dotyczących systemów Windows . Komenda
działa idealnie bez żadnych modyfikacji! Dlatego nie wolno używać
Remove-Item
,del
czy cokolwiek innego zamiastrm -rf
.Jeśli musisz podać ścieżkę do pliku lub katalogu, użyj ukośników, takich jak
./path/to/node_modules
źródło
Najlepszą i najdokładniejszą metodą, jaką znalazłem, było pobranie pliku bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
Następnie uruchom polecenia:
Jeśli chcesz usunąć pliki, użyj zamiast tego opcji delete-files:
źródło
Wydaje się, że odpowiedź się na bieżąco do tego celu jest nie używać
filter-branch
bezpośrednio (przynajmniej git sama nie poleca go już), oraz przesunięcie że narzędzie do pracy zewnętrznej. W szczególności obecnie zalecane jest git-filter-repo . Autor tego narzędzia podaje argumenty, dlaczegofilter-branch
bezpośrednie użycie może prowadzić do problemów.Większość wyżej wymienionych wielowierszowych skryptów do usunięcia
dir
z historii można zapisać ponownie:Najwyraźniej narzędzie jest potężniejsze. Możesz zastosować filtry według autora, adresu e-mail, zmiany nazwy i innych ( pełna strona podręcznika tutaj ). Ponadto jest szybki . Instalacja jest łatwa - jest dystrybuowana w różnych formatach .
źródło
pip3 install git-filter-repo
ponieważ jest on tylko stdlib i nie instaluje żadnych zależności. Na Ubuntu 18 jest niekompatybilny z wersją git distroError: need a version of git whose diff-tree command has the --combined-all-paths option
, ale łatwo jest go uruchomić nadocker run -ti ubuntu:20.04
Kompletny przepis kopiuj i wklej, po prostu dodając polecenia w komentarzach (dla rozwiązania kopiuj-wklej), po ich przetestowaniu:
Następnie możesz usunąć wiersz „node_modules /” z .gitignore
źródło
node_modules
z.gitignore
? Aby mogły zostać ponownie przypadkowo popełnione?node_modules
z.gitignore
.W przypadku użytkownika systemu Windows należy pamiętać, aby użyć
"
zamiast'
Dodano również,-f
aby wymusić polecenie, jeśli istnieje już inna kopia zapasowa.źródło
Usunąłem foldery bin i obj ze starych projektów w języku C # za pomocą git na Windowsie. Uważaj z
Niszczy integralność instalacji git, usuwając folder usr / bin w folderze instalacyjnym git.
źródło