Git-gc'yi ne sıklıkla kullanmalısınız?


233

Git-gc'yi ne sıklıkla kullanmalısınız?

Manuel sayfa basitçe diyor ki:

Kullanıcıların iyi disk alanı kullanımı ve iyi işletim performansı sağlamak için bu görevi her depoda düzenli olarak çalıştırması önerilir.

Gc zamanı olup olmadığını öğrenmek için bazı nesne sayılarını almak için bazı komutlar var mı?


Bu gibi görevler cron için birincil adaylardır (linux kullanıyorsanız) minhajuddin.com/2011/12/09/…
Khaja Minhajuddin

1
Not: gc.autodetach(Git 2.0 Q2 2014) ayarı git gc --autokullanıcıyı engellemeden çalışmaya yardımcı olabilir . bkz aşağıda Cevabımı .
VonC

Yanıtlar:


204

Çoğunlukla deponun ne kadar kullanıldığına bağlıdır. Bir kullanıcı günde bir kez kontrol ve haftada bir kez şube / birleştirme / vb operasyon ile muhtemelen yılda bir kereden fazla çalıştırmak gerekmez.

Her biri günde 2-3 kez kontrol eden birkaç düzine projede çalışan birkaç düzine geliştirici ile her gece çalıştırmak isteyebilirsiniz.

Gerçi, gerekenden daha sık çalıştırmak zarar vermez.

Şimdi ne yapacağım, o zaman bir hafta sonra disk kullanımını ölçün, tekrar çalıştırın ve tekrar disk kullanımını ölçün. Boyut olarak% 5 düşerse, haftada bir kez çalıştırın. Daha fazla düşerse, daha sık çalıştırın. Daha az düşerse, daha az sıklıkta çalıştırın.


17
Manual, "Bazı git komutları, birçok gevşek nesne oluşturabilecek işlemleri gerçekleştirdikten sonra git gc --auto komutunu çalıştırır." Gerçekten hangi komutları çalıştırdığını bilen var mı?
Joshua Dance

2
Büyük bir git rebase bariz bir örnektir, çünkü birçok taahhüt yeni bir tarihe yeniden yazılmıştır
repoda

20
"Gerekenden daha sık çalıştırmak zarar vermez" ... Tamamen katılmıyorum. Aristoteles'in belirttiği gibi, sarkan taahhütler iyi bir yedekleme mekanizması yapabilir.
Jason Baker

105

Deponuzu çöp toplamanın dezavantajı, çöpün toplanmasıdır. Hepimizin bilgisayar kullanıcısı olarak bildiği gibi, şu anda çöp olarak düşündüğümüz dosyalar gelecekte üç gün içinde çok değerli olabilir. Git'in enkazının çoğunu etrafta tutması, pastırmamı birkaç kez kurtardı - tüm sarkan taahhütlere göz atarak, yanlışlıkla konserve ettiğim birçok işi kurtardım.

Bu yüzden özel klonlarınızda çok temiz bir ucube olmayın. Buna çok az ihtiyaç var.

OTOH, veri kurtarılabilirlik değeri esas olarak uzaktan kumanda olarak kullanılan depolar için sorgulanabilir, örn. tüm geliştiricilerin ittiği ve / veya çekildiği yer. Orada, bir GC çalışmasını ve sık sık yeniden paketlemeyi başlatmak mantıklı olabilir.


38
FWIW tüm gevşek nesneler çöp olarak toplanmaz, yalnızca varsayılan olarak 2 haftadan eski olanlar (bkz. git gc --helpÖzellikle --pruneseçenek). Ayrıca, gc.reflogExpireson 90 gün içinde ziyaret ettiğiniz herhangi bir taahhüdün toplanmayacağına inanmamı sağlayan bir söz de var. (Git sürümüm: v1.7.6)
RobM

30

Git'in gc'nin son sürümleri gerektiğinde otomatik olarak çalışır, bu nedenle hiçbir şey yapmanıza gerek yoktur. Man git-gc (1) Seçenekler bölümüne bakın : "Bazı git komutları, çok sayıda gevşek nesne oluşturabilecek işlemler yaptıktan sonra git gc --auto komutunu çalıştırır."


13
İlk kez birkaç yıllık bir depoda çalıştırdım ve .git'im 16M'den 2.9M'ye gitti, boyutta% 82 azalma. Bu nedenle, komutu manuel olarak çalıştırmak hala yararlı görünmektedir.
Darshan Rivka Whittle

Git birkaç yıl içinde güncellemiştin mi?
std''OrgnlDave

1
@ std''OrgnlDave Evet, her zaman Arch'de mevcut olan her türlü sürümü çalıştırıyordum. Ben sadece tekrar koştu, belki de son yorumumdan beri ilk kez (bana hatırlatan yorumunuz sayesinde) ve .git'im 81M'den 13M'ye gitti. Çalışan komutların hiçbirini çalıştırmamalıyım gc --autosanırım.
Darshan Rivka Whittle

18

Eğer kullanıyorsanız Git-Gui , bu size söyler dert gerekirken:

This repository currently has approximately 1500 loose objects.

Aşağıdaki komut benzer bir sayı getirir:

$ git count-objects

, Hariç kaynak itibaren , git-gui aslında bir şey sayma, tek başına matematik yapacak .git/objectsklasörün ve muhtemelen bir yaklaşım getiriyor (Bilmiyorum tcldüzgün okumak için!).

Her durumda, yaklaşık 300 gevşek nesne etrafında rastgele bir sayıya dayalı uyarı veriyor gibi görünüyor .


Gerçekten de uyarıyor, ancak gc'yi çalıştırmasına izin verdikten sonra, çoğu zaman gc bir şey yapmayacak. Bunu yapmak için git gui'ye güvenmek, her zaman gc'yi tıklayıp bir dakika beklemek veya iptal etmek zorunda kaldığında 6000'den fazla gevşek nesneyi beklemektir: / Muhtemelen birisi git gui'yi maksimum gevşekliği kontrol edecek şekilde düzeltmelidir. nesne sayısı ve sayım sınıra ulaşana kadar iletişim kutusunu göstermek için uğraşmayın.
mlatu

Evet mlatu katılıyorum. Bunu yazdığımda sadece dikkat çekmek istedim. Hem Git-Guive count-objectsburada soruya tam olarak iyi cevaplar değildir ... Ama olmalı!
cregox

Bu kötü bir cevap olduğu anlamına gelmiyordu, sadece git gui çoğu şey yok işaret etmek istedim. git gc varsa da, yeterli yapmak ya da agresif anahtarı kullandığınız sürece çok fazla yapmıyoruz varsayalım.
mlatu

7

Uyurken her gece (öğleden sonra?) Çalışan bir cron işine bırakın.


7

Ben büyük bir ödeme yaptıktan sonra git gc kullanın ve bir sürü yeni nesne var. yerden tasarruf edebilirsiniz. Örneğin, git-svn kullanarak büyük bir SVN projesini satın alır ve bir git gc yaparsanız, genellikle çok fazla alan tasarrufu sağlarsınız


Bu hala doğru mu? '08 HDD alanı bile ucuzdu, bunu çalıştırmak için bir gerekçe olarak kullanmak anlamsız görünüyor
Thymine

7

Yeni (Git 2.0 Q2 2014) ayarı ile herhangi bir kesinti olmadan yapabilirsiniz gc.autodetach.

Bkz. Taahhüt 4c4ac4d ve taahhüt 9f673f9 ( Nguyễn Thái Ngọc Duy, aka pclouds ):

gc --autozaman alır ve kullanıcıyı geçici olarak engelleyebilir (ancak daha az rahatsız edici olamaz).
Onu destekleyen sistemlerde arka planda çalışmasını sağlayın.
Arka planda koşarken kaybedilen tek şey çıktılardır. Ama gc outputgerçekten ilginç değil.
Değiştirerek ön planda tutabilirsiniz gc.autodetach.


Bu 2.0 sürümünden bu yana bir hata oluştu: git 2.7 (4. Çeyrek 2015) hata mesajını kaybetmediğinizden emin olacak .
Bakınız Nguyễn Thái Ngọc Duy ( ) tarafından 329e6e8 (19 Eyl 2015) taahhüdü . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 076c827 tamamlama 2015 15 Eki)pclouds
gitster

gc: günlüğü arka plandan kaydet gc --autove bir dahaki sefere yazdır

İken 9f673f9 taahhüt ( gc: çalıştırmak için yapılandırma seçeneği --autoarka planda - 2014-02-08) 'ile ilgili bazı şikayetler azaltmaya yardımcı olur gc --autoterminali hogging', bu sorunların başka bir set oluşturur.

Bu setteki en son, arka plan programlamanın sonucu stderrolarak kapatılır ve tüm uyarılar kaybolur. Sonundaki bu uyarı cmd_gc()özellikle önemlidir çünkü kullanıcıya gc --autotekrar tekrar " " çalışmasını nasıl önleyeceğini anlatır .
Stderr kapalı olduğundan, kullanıcı bilmiyor, doğal olarak ` gc --auto` CPU israfını ' ' şikayet ediyorlar .

Daemonized gcşimdi kaydeder stderretmek $GIT_DIR/gc.log. Kullanıcı kaldırılana kadar
aşağıdakiler gc --autoçalışmaz ve gc.logyazdırılmazgc.log
.


6

Bu alıntı; Git ile Sürüm Kontrolü

Git çöp toplama işlemini otomatik olarak çalıştırır :

• Havuzda çok fazla gevşek nesne varsa

• Uzak bir depoya aktarma gerçekleştiğinde

• Birçok gevşek nesne tanıtabilecek bazı komutlardan sonra

• git reflog gibi bazı komutların süresi sona erdiğinde açıkça isteyin

Son olarak, git gc komutunu kullanarak açıkça istediğinizde çöp toplama işlemi gerçekleşir. Ama bu ne zaman olmalı? Bu sorunun kesin bir cevabı yok, ama iyi bir tavsiye ve en iyi uygulama var.

Git gc'yi birkaç durumda manuel olarak çalıştırmayı düşünmelisiniz:

• Git filtre dalını yeni tamamladıysanız. Filtre dalının birçok taahhüdü yeniden yazdığını, yenilerini tanıttığını ve eskilerinden sonuçlardan memnun kaldığınızda kaldırılması gereken bir ref bıraktığını hatırlayın. Tüm bu ölü nesneler (bunlara işaret eden tek referansı kaldırdığınız için artık referans verilmemektedir) çöp toplama yoluyla kaldırılmalıdır.

• Birçok komuttan sonra gevşek nesneler ekleyebilecek. Örneğin, bu büyük bir geri ödeme çabası olabilir.

Ve kapak tarafında, ne zaman çöp toplama konusunda dikkatli olmalısınız?

• Kurtarmak isteyebileceğiniz yetimsiz referanslar varsa

• Git rerere bağlamında ve çözünürlükleri sonsuza kadar kaydetmenize gerek yok

• Yalnızca etiketlerin ve dalların Git'in bir taahhüdü kalıcı olarak korumasına neden olması bağlamında

• FETCH_HEAD alımları bağlamında (git getirme yoluyla URL doğrudan alımlar) hemen çöp toplama işlemine tabi oldukları için


2
(Sonuç olarak git commit --amend) ağacımda ulaşılamayan taahhütlerim var . Bu ile doğrulanabilir git log --reflog. Uzak depoya bir şube ittim ve ağacımı tekrar kontrol ettim; ulaşılamaz taahhütler hâlâ oradaydı. Görünüşe göre git gcbu itme gerçekleşmedi. …?
chharvey

4

Büyük bir taahhütte bulunduğumda, her şeyden önce depodan daha fazla dosya kaldırdığımda kullanıyorum .. sonra, taahhütler daha hızlı


1

git gcÇok sık kullanmanız gerekmez , çünkü git gc(Çöp toplama) sık kullanılan birkaç komutta otomatik olarak çalıştırılır:

git pull
git merge
git rebase
git commit

Kaynak: git gc en iyi uygulamalar ve SSS

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.