Krótka wersja: oznacza to, co mówi, a jeśli po prostu pozwolisz jej zakończyć, wszystko będzie dobrze.
Podczas większości operacji, które mogą potencjalnie zwiększyć liczbę luźnych (rozpakowanych) obiektów w repozytorium (w tym wypycha), Git wywołuje git gc --auto
. Jeśli jest wystarczająco dużo luźnych obiektów (domyślnie co najmniej 6700), wywoła je, git repack -d -l
aby je spakować. Jeśli jest zbyt wiele oddzielnych paczek, przepakuje je również w jedno.
Pakiet to pojedynczy plik skompresowany w formacie delta, zawierający dużą liczbę obiektów. Bardziej wydajne jest przechowywanie obiektów w paczkach, ale pakowanie (kompresowanie) obiektów wymaga czasu, więc Git początkowo tworzy luźne obiekty, a następnie od czasu do czasu pakuje je partiami, automatycznie wywołując git gc --auto
.
Jeśli pozwolisz Gitowi zakończyć pakowanie, to się nie powtórzy. Może to rzeczywiście zająć trochę czasu, zwłaszcza jeśli masz dużo dużych obiektów binarnych, ale jeśli się uruchomi, oznacza to, że prawdopodobnie drastycznie zmniejszy ilość miejsca na dysku zajętego przez repo. Jeśli naprawdę nie chcesz, aby tak się stało, możesz zmienić parametr config gc.auto
. Jeśli zwiększysz go do czegoś znacznie większego niż 6700, zdarzy się to rzadziej, ale zajmie to więcej czasu. Jeśli go zmniejszysz, nadal będziesz musiał wykonać bieżące przepakowanie, ale później będzie to miało miejsce częściej i zakończy się szybciej. Ustawienie wartości 0 spowoduje wyłączenie automatycznego przepakowywania.
Aby uzyskać więcej informacji, zobacz man git-gc
(pod --auto
) i man git-config
(pod gc.auto
).
fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack
- to właśnie dostaję za umieszczenie całej naszej bazy kodu w jednym repozytorium git. Zgaduję, że mam zamiar zabijać aplikacje i wymuszać przepakowanie „ręcznie”Podczas gdy Jefroni ma rację, że czasami automatyczne pakowanie potrzebuje tylko czasu, aby zakończyć, jeśli komunikat automatycznego pakowania będzie się utrzymywał przez wiele dni, jak opisuje OP, istnieje duża szansa, że podczas czyszczenia gita brakuje wiszących obiektów, jak opisano w tym pytaniu .
Aby sprawdzić, czy wiszące obiekty wyzwalają bieżące komunikaty o automatycznym pakowaniu, spróbuj uruchomić
git fsck
. Jeśli otrzymasz długą listę zwisających zatwierdzeń, możesz je wyczyścićgit gc --prune=now
Zwykle muszę uruchamiać to na moim repozytorium co 2-3 miesiące, gdy komunikat automatycznego pakowania nie zniknie po jednym pociągnięciu.
źródło
git pull
przez kilka dni, ifsck
rzeczywiście pokazywałem mnóstwo zwisających zobowiązań.Aby wyłączyć dla jednego projektu:
Aby wyłączyć globalnie:
źródło
Git uruchamia git-repack, który pakuje wiele obiektów (= pliki, zatwierdzenia i drzewa) w jeden plik pakietu. Git robi to czasami, gdy heurysta mówi, że można zaoszczędzić miejsce (plik paczki zawiera skompresowane delty obiektów, a każdy plik w katalogu objects / zawiera skompresowaną pełną zawartość pliku)
źródło
Mamy nadzieję, że ten
git gc --auto
krok jest teraz (git 2.0.1, 25 czerwca 2014 r.) Bardziej wydajny.Zobacz commit 62aad18 autor: Nguyễn Thái Ngọc Duy (
pclouds
)gc --auto
: nie blokuj odnośników w tleA Git 2.22 (drugi kwartał 2019 r.) Dodatkowo optymalizuje
git gc
.źródło