“Depoyu optimum performans için otomatik paketleme” ne anlama geliyor?


225

Git repo ile ilgili bir sorunum var. Son birkaç gün boyunca sunucuya her basışımda şu iletiyi alıyorum: "Depoyu en iyi performans için otomatik olarak paketleme" ve uzaklaşıp kabuğunu geri döndürmüyor gibi görünüyor.

Ayrıca yeni bir şubeye bakmayı ve sonra önceki şubemde bir rebase yapmayı denedim ve sonra git gckullanılmayan geçmiş nesnelerini kaldırdım ve sonra bir itme yaptım ama yine de bu mesaj görünüyor. Lütfen depomda neler olup bittiğini bana bildirin.

Yanıtlar:


305

Kısa versiyon: söylediği anlamına gelir ve eğer bitmesine izin verirseniz, her şey iyi olacak.

Depodaki gevşek (paketlenmemiş) nesnelerin sayısını artırabilecek çoğu işlem sırasında (push'lar dahil) Git çağırır git gc --auto. Yeterli gevşek nesne varsa (varsayılan olarak en az 6700), git repack -d -lbunları paketlemeye çağırır . Çok fazla ayrı paket varsa, bunları bir pakete yeniden paketleyecektir.

Paket, çok sayıda nesne içeren delta sıkıştırılmış tek bir dosyadır. Nesneleri paketlerde saklamak daha etkilidir, ancak nesneleri paketlemek (sıkıştırmak) zaman alır, bu nedenle Git başlangıçta gevşek nesneler oluşturur, ardından otomatik çağırma yoluyla bunları şimdi ve sonra toplu olarak paketler git gc --auto.

Git'in yeniden paketlemeyi bitirmesine izin verirseniz, bu bir süre daha gerçekleşmez. Özellikle çok büyük ikili nesneleriniz varsa, biraz zaman alabilir, ancak tetikliyorsa, muhtemelen repo tarafından alınan disk alanı miktarını önemli ölçüde azaltacağının bir işaretidir. Gerçekten olmasını istemiyorsanız, config parametresini değiştirebilirsiniz gc.auto. Eğer 6700'den daha büyük bir şeye arttırırsanız, daha az sıklıkta olur, ancak daha uzun sürer. Eğer düşürürseniz, yine de mevcut yeniden paketinizi yapmanız gerekir, ancak daha sonra daha sık gerçekleşecek ve daha hızlı bitecektir. 0 olarak ayarlarsanız, otomatik yeniden paketlemeyi devre dışı bırakır.

Daha fazla bilgi için man git-gc(altında --auto) ve man git-config(altında gc.auto) konusuna bakın .


14
Gerçekten, bu benim için yaklaşık 5 dakika sürdü, ama bitti. Mükemmel cevap.
Joshua Pinter

6
Her itişte bunun gerçekleştiğini görüyoruz (birkaç saniye, heh).

2
@dpk: Bu normal koşullarda gerçekleşmemelidir - tek bir itme sırasındaki nesnelerin sayısı onu tetikleyecek kadar büyük olmamalıdır (deponuz muazzam değilse ve / veya bir ton taahhütte bulunuyorsanız), bu yüzden başarıyla tamamlar (tamamlamanıza izin veriyorsunuz değil mi?) Eğer çözemiyorsanız, ayrı bir soru sorun.
Cascabel

6
"Git'in bitmesine izin verirseniz" ve ... fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack- kod kodumuzu tek bir git deposuna yapıştırmak için aldığım şey budur. Ben uygulamalar ve "elle" kuvvet repack öldüreceğim Tahmin
ruffin

11
Git çekişimi her yaptığımda anlıyorum. Manuel git gc yaptım, ama her çektiğimde hala oluyor. Tuhaf.
Barry Kelly

51

Jefroni bazen otomatik paketlemenin tamamlanması için zamana ihtiyaç duyduğu konusunda doğru olsa da, otomatik paketleme mesajı OP'nin açıkladığı gibi birkaç gün boyunca devam ederse, bu sorunun açıklandığı gibi git'in temizlemesinin sarkan nesneleri kaçırması ihtimali yüksektir .

Sarkan nesnelerin otomatik paketleme hakkında devam eden mesajları tetikleyip tetiklemediğini görmek için çalıştırmayı deneyin git fsck. Uzun bir sarkan taahhüt listesi alırsanız,

git gc --prune=now

Genellikle otomatik paketleme mesajının tek bir çekmeden sonra gitmediği her 2-3 ayda bir repo'mda çalıştırmam gerekir.


5
Kabul edilen cevap olmasa da, tam da ihtiyacım olan buydu. Mesajı her git pullgün yaptığımda , birkaç gün boyunca aldım ve fsckgerçekten bir ton sarkık taahhüt gösterdim.
Jörn Zaefferer

36

Bir proje için devre dışı bırakmak için:

cd your_project_dir
git config gc.auto 0

Genel olarak devre dışı bırakmak için:

git config --global gc.auto 0

2
Sanırım nasıl olduğunu öğrendim: .git klasörüne gidin, yapılandırma dosyasını açın ve 'auto = 0' metnini silin ve kaydedin. Bu otomatik paketlemeyi yeniden etkinleştiriyor gibi görünüyor.
Adrian Keister

18
git config --unset gc.auto
jtatum

10

Git, birçok nesneyi (= dosyalar, komutlar ve ağaçlar) tek bir paket dosyasına paketleyen git-repack'i çalıştırıyor. Git bazen sezgisel bir alanın kaydedilebileceğini söylediğinde bunu yapar (bir paket dosyası sıkıştırılmış nesne deltaları içerirken, nesneler / dizindeki her dosya sıkıştırılmış tam dosya içeriği içerir)


2

Umarım, bu git gc --autoadım şimdi (git 2.0.1, 25 Haziran 2014) daha verimlidir.
Bkz 62aad18 taahhüt tarafından (Nguyen Tay Ngọc Duy pclouds)

gc --auto: arka planda referansları kilitlemeyin

9f673f9 ( gc: yapılandırma seçeneği - arka planda otomatik - 2014-02-08, Git 2.0.0) gc --autokullanıcının bekleme süresini azaltmak için arka planda " " yerleştirir .
Çöp toplamanın bir kısmı pack-ref ve budama refloglarıdır. Bunlar bazı referansların kilitlenmesini gerektirir ve aynı referansı kilitlemeye çalışan diğer işlemleri iptal edebilir.

Eğer gc --autobir komut dosyası orta içinde ateşlendiğinde, arka planda GC'ın tutan kilitleri önce asla olamayacağını senaryoyu, başarısız olabilir 9f673f9 .

Paralel ref güncellemelerini durdurmak için önünüzde pack-refs" reflog --prune" çalışmaya devam edin . Kalan arka plan işlemleri (yeniden paketleme, budama ve tekrar oluşturma) git işlemlerini etkilememelidir.

Git 2.22 (Q2 2019) daha da optimize ediyorgit gc .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.