"Uzun ve karmaşık bir geçmişi" içe aktardıktan sonra bunu düzgün bir şekilde yapmak için önerdiği komut,
Date: Wed, 5 Dec 2007 22:09:12 -0800 (PST)
From: Linus Torvalds <torvalds at linux-foundation dot org>
To: Daniel Berlin <dberlin at dberlin dot org>
cc: David Miller <davem at davemloft dot net>,
ismail at pardus dot org dot tr,
gcc at gcc dot gnu dot org,
git at vger dot kernel dot org
Subject: Re: Git and GCC
In-Reply-To: <4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
Message-ID: <alpine.LFD.0.9999.0712052132450.13796@woody.linux-foundation.org>
References: <4aca3dc20712051947t5fbbb383ua1727c652eb25d7e@mail.gmail.com>
<20071205.202047.58135920.davem@davemloft.net>
<4aca3dc20712052032n521c344cla07a5df1f2c26cb8@mail.gmail.com>
<20071205.204848.227521641.davem@davemloft.net>
<4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
6 Aralık 2007 Perşembe günü Daniel Berlin şunları yazdı:
Aslında, git-gc --aggressive
bu aptalca şeyi bazen bir SVN deposundan dönüştürüp dönüştürmediğinize bakılmaksızın dosyaları paketlemek için yapıyor.
Kesinlikle. git --aggressive
çoğunlukla aptaldır. Bu gerçekten yalnızca "Biliyorum, gerçekten kötü bir paketim ve yaptığım tüm kötü paketleme kararlarını atmak istiyorum .
Bunu açıklamak için, git delta zincirlerinin nasıl çalıştığını ve diğer birçok sistemden ne kadar farklı olduklarını açıklamaya değer (muhtemelen bunun farkındasınız, ancak yine de temelleri gözden geçirmeme izin verin).
Diğer SCM'lerde, bir delta zinciri genellikle sabittir. "İleri" veya "geriye doğru" olabilir ve siz depoyla çalışırken biraz gelişebilir, ancak genellikle bir tür tek SCM varlığı olarak temsil edilen tek bir dosyadaki değişiklikler zinciridir. CVS'de, bu açıkça *,v
dosyadır ve diğer birçok sistem oldukça benzer şeyler yapar.
Git ayrıca delta zincirleri de yapıyor, ancak onları çok daha "gevşek" yapıyor. Sabit bir varlık yoktur. Deltalar, git'in iyi bir delta adayı (oldukça başarılı çeşitli buluşsal yöntemler ile) olarak gördüğü herhangi bir rasgele başka versiyona karşı oluşturulur ve kesinlikle hiçbir katı gruplama kuralı yoktur.
Bu genellikle çok iyi bir şeydir. Çeşitli kavramsal nedenlerden dolayı iyidir ( yani , dahili olarak git hiçbir zaman tüm revizyon zincirini önemsemeye bile gerek duymaz - gerçekten deltalar açısından düşünmez), ama aynı zamanda harika çünkü esnek olmayan delta kurallarından kurtulmak demektir Git'in iki dosyayı bir araya getirme konusunda hiçbir problemi yok, örneğin - sadece keyfi yok*,v
bazı gizli anlamı olan "revizyon dosyaları" .
Bu aynı zamanda delta seçiminin çok daha açık uçlu bir soru olduğu anlamına gelir. Delta zincirini tek bir dosyayla sınırlarsanız, deltalar hakkında ne yapacağınız konusunda gerçekten çok fazla seçeneğiniz olmaz, ancak git'te bu gerçekten tamamen farklı bir sorun olabilir.
Ve gerçekten kötü bir şekilde adlandırılmış olan yer burasıdır --aggressive
. Git genellikle delta bilgisini yeniden kullanmaya çalışırken (çünkü bu iyi bir fikirdir ve daha önce bulduğumuz tüm iyi deltaları yeniden bulmak için CPU zamanını boşa harcamaz), bazen siz "boş bir sayfayla baştan başlayalım ve önceki tüm delta bilgilerini yok sayalım ve yeni bir delta kümesi oluşturmaya çalışalım" demek istiyorum.
Yani --aggressive
gerçekten agresif olmakla ilgili değil, daha önce verdiğimiz bir kararı yeniden yaparak CPU zamanını boşa harcamakla ilgili!
Bazen bu iyi bir şeydir. Özellikle bazı ithalat araçları gerçekten korkunç derecede kötü deltalar oluşturabilir. Kullanan her şeygit fast-import
Örneğin, büyük olasılıkla çok iyi bir delta düzenine sahip değildir, bu nedenle "Temiz bir sayfadan başlamak istiyorum" demeye değer olabilir.
Ama neredeyse her zaman, diğer durumlarda, aslında yapılması gerçekten çok kötü bir şey. Bu, CPU zamanını boşa harcayacak ve özellikle daha önce deltaing konusunda gerçekten iyi bir iş çıkardıysanız, sonuç zaten bulduğunuz tüm bu iyi deltaları yeniden kullanmayacaktır , bu yüzden aslında çok fazla daha da kötü sonuç!
Junio'ya bir yama göndereceğim. git gc --aggressive
Belgeleri . Yararlı olabilir, ancak genellikle ne yaptığını çok derin bir düzeyde anladığınızda ve bu dokümantasyon bunu yapmanıza yardımcı olmadığında faydalıdır.
Genel olarak, artımlı yapmak git gc
doğru yaklaşımdır ve yapmaktan daha iyidir git gc --aggressive
. Eski deltaları yeniden kullanacak ve bu eski deltalar bulunamadığında (ilk etapta artımlı GC yapmanın nedeni!) Yenilerini yaratacak.
Öte yandan, "uzun ve karmaşık bir tarihin ilk ithalatı" nın, gerçekten iyi deltaları bulmak için çok zaman harcamaya değecek bir nokta olduğu kesinlikle doğrudur . Daha sonra, her kullanıcı (bunu git gc --aggressive
geri almak için kullanmadıkları sürece!) Bu tek seferlik olaydan yararlanacaktır. Bu nedenle, özellikle uzun bir geçmişe sahip büyük projeler için, deltaya kodu bulmasını söyleyerek biraz fazladan çalışma yapmaya değer.
Öyleyse eşdeğeri git gc --aggressive
- ancak düzgün yapıldığında - gibi bir şey (bir gecede) yapmaktır
git repack -a -d --depth=250 --window=250
burada bu derinlik meselesi, delta zincirlerinin ne kadar derin olabileceğiyle ilgilidir (eski tarih için onları daha uzun hale getirin - uzay ek yüküne değer) ve pencere meselesi, her delta adayının taramasını istediğimiz nesne penceresinin ne kadar büyük olduğuyla ilgilidir.
Ve burada, pekala eklemek isteyebilirsiniz -f
bayrağı ("tüm eski deltaları bırak" dır, çünkü şimdi gerçekten bunun iyi adaylar bulduğundan emin olmaya çalışıyorsunuz.
Ve sonra sonsuza kadar sürecek ( yani , "bir gecede yap" şeyi). Ancak sonuç şu ki, o depodan aşağı akıştaki herkes, kendi başına herhangi bir çaba harcamadan çok daha iyi paketler alacak.
Linus