Sprawdziłem załadowane pliki w gałęzi i scaliłem, a potem musiałem je usunąć i teraz mam duży plik .pack, którego nie wiem, jak się pozbyć.
Usunąłem wszystkie pliki za pomocą git rm -rf xxxxxx
i również uruchomiłem tę --cached
opcję.
Czy ktoś może mi powiedzieć, jak mogę usunąć duży plik .pack, który znajduje się obecnie w następującym katalogu:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
Czy muszę po prostu usunąć gałąź, którą nadal mam, ale już nie używam? Czy jest jeszcze coś, co muszę uruchomić?
Nie jestem pewien, ile to robi, ale pokazuje kłódkę przy teczce.
Dzięki
EDYTOWAĆ
Oto kilka fragmentów mojej historii bash_history, które powinny dać wyobrażenie, jak udało mi się wejść w ten stan (załóżmy, że w tym momencie pracuję nad gałęzią git o nazwie `` moja-gałąź '' i mam folder zawierający więcej folderów / pliki):
git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/ (not sure why I ran this as well but I did)
Myślałem, że wykonałem również następujące czynności, ale nie pojawia się w bash_history z innymi:
git rm -rf --cached unwanted_folder/
Pomyślałem również, że uruchomiłem kilka poleceń git (takich jak git gc
), aby spróbować uporządkować plik pakietu, ale nie pojawiają się one również w pliku .bash_history.
źródło
Odpowiedzi:
Problem polega na tym, że nawet jeśli usunąłeś pliki, są one nadal obecne w poprzednich wersjach. O to chodzi w git, nawet jeśli coś usuniesz, nadal możesz to odzyskać, uzyskując dostęp do historii.
To, co chcesz zrobić, nazywa się przepisywaniem historii i obejmowało
git filter-branch
polecenie.GitHub ma dobre wyjaśnienie problemu na swojej stronie. https://help.github.com/articles/remove-sensitive-data
Aby odpowiedzieć na pytanie bardziej bezpośrednio, w zasadzie musisz uruchomić to polecenie z
unwanted_filename_or_folder
odpowiednio zastąpionym:Spowoduje to usunięcie wszystkich odniesień do plików z aktywnej historii repozytorium.
Następny krok, aby wykonać cykl GC w celu wymuszenia wygaśnięcia wszystkich odwołań do pliku i usunięcia go z pliku pakietu. W tych poleceniach nie trzeba nic zmieniać.
źródło
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
2)git reflog expire --expire=now --all
3)git gc --prune=now
bfg
znacznie łatwiejsze. Jest to również zalecane w oficjalnych dokumentach github: help.github.com/articles/ ...Scenariusz A : Jeśli duże pliki zostały dodane tylko do gałęzi, nie musisz uruchamiać
git filter-branch
. Wystarczy usunąć gałąź i uruchomić czyszczenie pamięci:Scenariusz B : Jednak na podstawie historii basha wygląda na to, że scaliłeś zmiany w master. Jeśli nikomu nie udostępniłeś zmian (
git push
jeszcze nie ). Najłatwiej byłoby zresetować master z powrotem do stanu sprzed scalenia z gałęzią, która zawiera duże pliki. Spowoduje to wyeliminowanie wszystkich zatwierdzeń z twojej gałęzi i wszystkich zatwierdzeń dokonanych do mastera po scaleniu. Więc możesz stracić zmiany - oprócz dużych plików - które mogłeś chcieć:Następnie wykonaj kroki ze scenariusza A.
Scenariusz C : Jeśli po scaleniu nastąpiły inne zmiany z gałęzi lub zmiany na wzorcu, które chcesz zachować, najlepiej byłoby zmienić bazę danych nadrzędnych i wybiórczo dołączyć wybrane zmiany:
W swoim edytorze usuń wiersze odpowiadające zatwierdzeniom, które dodały duże pliki, ale pozostaw wszystko inne bez zmian. Zapisz i wyjdź. Twoja gałąź główna powinna zawierać tylko to, co chcesz, bez dużych plików. Zwróć uwagę, że
git rebase
bez-p
tego usunie się scalanie zatwierdzeń, więc pozostaniesz z liniową historią dla mastera po<commit hash>
. Prawdopodobnie jest to dla ciebie w porządku, ale jeśli nie, możesz spróbować-p
, alegit help rebase
mówicombining -p with the -i option explicitly is generally not a good idea unless you know what you are doing
.Następnie uruchom polecenia ze scenariusza A.
źródło
Jak już loganfsmyth stwierdził w swojej odpowiedzi , musisz wyczyścić historię git, ponieważ pliki nadal tam istnieją, nawet po usunięciu ich z repozytorium. Oficjalna dokumentacja GitHub poleca BFG, który jest dla mnie łatwiejszy w użyciu niż
filter-branch
:Usuwanie plików z historii
Pobierz BFG z ich strony internetowej. Upewnij się, że masz zainstalowaną Javę, a następnie utwórz kopię lustrzaną i wyczyść historię. Pamiętaj, aby zastąpić
YOUR_FILE_NAME
nazwą pliku, który chcesz usunąć:Usuń folder
To samo co powyżej, ale użyj
--delete-folders
Inne opcje
BFG pozwala również na jeszcze bardziej wyszukane opcje (patrz dokumentacja ), takie jak te:
Usuń z historii wszystkie pliki większe niż 100 MB:
Ważny!
Podczas uruchamiania BFG należy uważać, aby obie nazwy
YOUR_FILE_NAME
iYOUR_FOLDER_NAME
rzeczywiście były tylko nazwami plików / folderów. To nie są ścieżki , więc coś takiegofoo/bar.jpg
nie zadziała! Zamiast tego wszystkie pliki / foldery o określonej nazwie zostaną usunięte z historii repozytorium, bez względu na ścieżkę lub gałąź, w której istniały.źródło
bfg
narzędzie do lokalnego repozytorium git, jak powinno wyglądać polecenie?Jedna opcja:
uruchomić
git gc
ręcznie, aby skondensować kilka plików paczek w jeden lub kilka plików paczek. Ta operacja jest trwała (tzn. Duży plik paczki zachowa swoje zachowanie kompresji), więc może być korzystne okresowe kompresowanie repozytorium za pomocągit gc --aggressive
Inną opcją jest zapisanie kodu i .git gdzieś, a następnie usunięcie .git i ponowne rozpoczęcie korzystania z tego istniejącego kodu, tworząc nowe repozytorium git (
git init
).źródło
git gc
i przeszedłem do kilku plików paczek, ale duży nadal jest jednym z nich i chciałbym się go pozbyć, aby móc łatwiej wykonać kopię zapasową folderu na zewnątrz (wcześniej zip był 1 -2 MB, teraz 55 MB). Chyba że ktoś może zasugerować cokolwiek innego, myślę, że będę musiał stworzyć świeżego dupka. Zakładam, że to oznacza, że stracę dostęp do gałęzi, które obecnie posiadam itp.?Uruchom następujące polecenie, zastępując
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
ścieżkę do pliku, który chcesz usunąć, a nie tylko jego nazwę. Te argumenty:Spowoduje to wymuszenie usunięcia wszystkich odniesień do plików z aktywnej historii repozytorium.
Następny krok, aby wykonać cykl GC w celu wymuszenia wygaśnięcia wszystkich odniesień do pliku i usunięcia go z pliku pakietu. W tych poleceniach nie trzeba nic zmieniać.
źródło
Trochę się spóźniłem na pokaz, ale jeśli powyższa odpowiedź nie rozwiązała pytania, znalazłem inny sposób. Po prostu usuń określony duży plik z .pack. Miałem ten problem, w którym przypadkowo wpisałem duży plik 2 GB. Postępowałem zgodnie z instrukcjami podanymi w tym linku: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/
źródło
jest to bardziej poręczne rozwiązanie niż kodowanie. spakuj plik. Otwórz plik zip w formacie widoku pliku (różnym od rozpakowywania). Usuń plik .pack. Rozpakuj i zamień folder. Działa jak marzenie!
źródło