Musiałem przeczytać kilka odpowiedzi i kilka innych informacji, aby zrozumieć, co robię.
1. Zignoruj wszystko starsze niż określony zatwierdzenie
Plik .git/info/grafts
może definiować fałszywych rodziców dla zatwierdzenia. Linia z tylko identyfikatorem zatwierdzenia mówi, że zatwierdzenie nie ma rodzica. Jeśli chcielibyśmy powiedzieć, że zależy nam tylko na ostatnich 2000 zatwierdzeniach, możemy wpisać:
git rev-parse HEAD~2000 > .git/info/grafts
git rev-parse podaje nam identyfikator zatwierdzenia 2000. rodzica bieżącego zatwierdzenia. Powyższe polecenie zastąpi plik przeszczepów, jeśli jest obecny. Sprawdź, czy jest tam pierwszy.
2. Przepisz historię Git (opcjonalnie)
Jeśli chcesz, aby ten szczepiony fałszywy rodzic był prawdziwym rodzicem, uruchom:
git filter-branch -- --all
Zmieni wszystkie identyfikatory zatwierdzeń. Każda kopia tego repozytorium musi zostać silnie zaktualizowana.
3. Oczyść miejsce na dysku
Nie zrobiłem kroku 2, ponieważ chciałem, aby moja kopia była zgodna z wersją wstępną. Chciałem tylko zaoszczędzić trochę miejsca na dysku. Aby zapomnieć o wszystkich starych zobowiązaniach:
git prune
git gc
Alternatywnie: płytkie kopie
Jeśli masz płytką kopię innego repozytorium i po prostu chcesz zaoszczędzić trochę miejsca na dysku, możesz zaktualizować .git/shallow
. Ale uważaj, aby nic nie wskazywało na zatwierdzenie wcześniej. Abyś mógł uruchomić coś takiego:
git fetch --prune
git rev-parse HEAD~2000 > .git/shallow
git prune
git gc
Wpis w płytkiej pracy działa jak przeszczep. Ale uważaj, aby nie używać jednocześnie przeszczepów i płytki. Przynajmniej nie miej tam takich samych wpisów, to się nie powiedzie.
Jeśli nadal masz jakieś stare odwołania (tagi, gałęzie, zdalne głowy), które wskazują na starsze zatwierdzenia, nie zostaną one wyczyszczone i nie zaoszczędzisz więcej miejsca na dysku.
git filter-branch --tag-name-filter cat -- --all
aby zaktualizować tagi. Ale mam też starsze tagi wskazujące na starą historię, którą chcę usunąć. Jak mogę pozbyć się wszystkich starych tagów? Jeśli ich nie usunę, starsza historia nie zniknie i nadal mogę to zobaczyćgitk --all
.