Perintah yang dia sarankan untuk melakukan ini dengan benar setelah mengimpor "sejarah yang panjang dan terlibat" adalah
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>
Pada Kamis, 6 Des 2007, Daniel Berlin menulis:
Sebenarnya, ternyata git-gc --aggressivemelakukan hal bodoh ini untuk mengemas file terkadang terlepas dari apakah Anda mengonversi dari repo SVN atau tidak.
Benar. git --aggressivekebanyakan bodoh. Ini benar-benar hanya berguna untuk kasus “Saya tahu saya punya benar - benar buruk, dan saya ingin membuang semua keputusan pengepakan yang buruk yang telah saya lakukan."
Untuk menjelaskan ini, ada baiknya menjelaskan (Anda mungkin menyadarinya, tapi biarkan saya membahas dasar-dasarnya) bagaimana rantai-delta git bekerja, dan bagaimana mereka sangat berbeda dari kebanyakan sistem lain.
Di SCM lain, rantai-delta umumnya diperbaiki. Ini mungkin "maju" atau "mundur," dan mungkin berkembang sedikit saat Anda bekerja dengan repositori, tetapi umumnya itu adalah rantai perubahan ke satu file yang direpresentasikan sebagai semacam entitas SCM tunggal. Di CVS, itu jelas*,v file, dan banyak sistem lain melakukan hal yang agak mirip.
Git juga melakukan rantai-delta, tetapi melakukannya dengan lebih “longgar”. Tidak ada entitas tetap. Delta dibuat berdasarkan versi acak lainnya yang dianggap git sebagai kandidat delta yang baik (dengan berbagai heuristik yang cukup berhasil), dan sama sekali tidak ada aturan pengelompokan yang ketat.
Ini umumnya merupakan hal yang sangat bagus. Ini bagus untuk berbagai alasan konseptual ( yaitu , git secara internal bahkan tidak pernah benar-benar perlu peduli dengan keseluruhan rantai revisi - tidak benar-benar memikirkan delta sama sekali), tetapi juga bagus karena menyingkirkan aturan delta yang tidak fleksibel berarti bahwa git tidak memiliki masalah sama sekali dengan menggabungkan dua file menjadi satu, misalnya - tidak ada *,v“file revisi” yang memiliki arti tersembunyi.
Ini juga berarti bahwa pilihan delta adalah pertanyaan yang jauh lebih terbuka. Jika Anda membatasi rantai delta menjadi hanya satu file, Anda benar-benar tidak memiliki banyak pilihan tentang apa yang harus dilakukan tentang delta, tetapi di git, ini bisa menjadi masalah yang sama sekali berbeda.
Dan di sinilah nama yang sangat buruk --aggressive . Meskipun git biasanya mencoba menggunakan kembali informasi delta (karena itu ide yang bagus, dan tidak membuang waktu CPU untuk menemukan kembali semua delta bagus yang kami temukan sebelumnya), terkadang Anda ingin mengatakan “mari kita mulai dari awal, dengan slate kosong, dan abaikan semua informasi delta sebelumnya, dan coba buat sekumpulan delta baru”.
Jadi --aggressivebukan tentang menjadi agresif, tetapi tentang membuang-buang waktu CPU untuk melakukan kembali keputusan yang telah kita lakukan sebelumnya!
Terkadang itu adalah hal yang baik. Beberapa alat impor khususnya dapat menghasilkan delta yang sangat buruk. Apa pun yang menggunakan git fast-import, misalnya, kemungkinan besar tidak memiliki tata letak delta yang bagus, jadi sebaiknya Anda mengatakan "Saya ingin memulai dari yang bersih".
Tapi hampir selalu, dalam kasus lain, itu sebenarnya hal yang sangat buruk untuk dilakukan. Ini akan membuang-buang waktu CPU, dan terutama jika Anda benar-benar telah melakukan pekerjaan delta dengan baik sebelumnya, hasil akhirnya tidak akan menggunakan kembali semua delta bagus yang sudah Anda temukan, jadi Anda akan mendapatkan banyak hasil akhir yang lebih buruk juga!
Saya akan mengirim tambalan ke Junio untuk menghapus git gc --aggressive
dokumentasinya. Ini bisa berguna, tetapi umumnya berguna hanya ketika Anda benar-benar memahami pada tingkat yang sangat dalam apa yang dilakukannya, dan dokumentasi itu tidak membantu Anda melakukannya.
Secara umum, melakukan incremental git gcadalah pendekatan yang tepat, dan lebih baik daripada melakukan git gc --aggressive. Ini akan menggunakan kembali delta lama, dan ketika delta lama itu tidak dapat ditemukan (alasan untuk melakukan GC inkremental di tempat pertama!) Itu akan membuat yang baru.
Di sisi lain, memang benar bahwa "impor awal dari sejarah yang panjang dan terlibat" adalah titik di mana menghabiskan banyak waktu untuk menemukan delta yang benar - benar bagus akan bermanfaat . Kemudian, setiap pengguna setelahnya (selama mereka tidak menggunakannya git gc --aggressiveuntuk mengurungkannya!) Akan mendapatkan keuntungan dari peristiwa satu kali tersebut. Jadi, terutama untuk proyek besar dengan sejarah panjang, mungkin ada baiknya melakukan beberapa pekerjaan ekstra, memberi tahu kode pencarian delta untuk menjadi liar.
Jadi yang setara dengan git gc --aggressive- tetapi dilakukan dengan benar - adalah melakukan (dalam semalam) sesuatu seperti
git repack -a -d --depth=250 --window=250
di mana kedalaman itu hanya tentang seberapa dalam rantai delta bisa (membuatnya lebih panjang untuk sejarah lama - itu sepadan dengan overhead ruang), dan masalah jendela adalah tentang seberapa besar jendela objek yang kita inginkan untuk dipindai setiap kandidat delta.
Dan di sini, Anda mungkin ingin menambahkan -fflag (yang merupakan "hapus semua delta lama", karena Anda sekarang sebenarnya mencoba memastikan bahwa yang ini benar-benar menemukan kandidat yang baik.
Dan kemudian itu akan memakan waktu selamanya dan satu hari ( yaitu , hal "lakukan dalam semalam"). Tetapi hasil akhirnya adalah setiap orang yang berada di hilir dari repositori itu akan mendapatkan paket yang jauh lebih baik, tanpa harus mengeluarkan tenaga untuk itu sendiri.
Linus