Sekarang file 'besar' yang sama berada di kedua garpu pengembang di server. Itu tidak membuat tautan keras secara otomatis
Sebenarnya, dengan Git 2.20, masalah itu mungkin hilang, karena pulau delta , cara baru dalam melakukan komputasi delta sehingga objek yang ada di satu fork tidak dijadikan delta terhadap objek lain yang tidak muncul di repositori bercabang yang sama .
Lihat komit fe0ac2f, komit 108f530, komit f64ba53 (16 Agustus 2018) oleh Christian Couder (chriscool
).
Dibantu oleh:Jeff King (peff
), dan Duy Nguyen (pclouds
).
Lihat komit 9eb0986, komit 16d75fa, komit 28b8a73, komit c8d521f (16 Agustus 2018) oleh Jeff King (peff
).
Dibantu oleh:Jeff King (peff
), dan Duy Nguyen (pclouds
).
Tambahkan
delta-islands.{c,h}
Penyedia hosting yang mengizinkan pengguna untuk "mem-fork" repositori yang ada ingin agar fork tersebut berbagi ruang disk sebanyak mungkin.
Alternatif adalah solusi yang ada untuk menyimpan semua objek dari semua garpu ke dalam repositori pusat yang unik, tetapi ini dapat memiliki beberapa kelemahan.
Terutama saat mengemas repositori pusat, delta akan dibuat di antara objek dari cabang yang berbeda.Hal ini dapat membuat kloning atau pengambilan fork jauh lebih lambat dan lebih intensif CPU karena Git mungkin harus menghitung delta baru untuk banyak objek guna menghindari pengiriman objek dari fork yang berbeda.
Karena ketidakefisienan terutama muncul saat sebuah objek dideltifikasi terhadap objek lain yang tidak ada di percabangan yang sama, kami mempartisi objek menjadi kumpulan yang muncul di percabangan yang sama, dan mendefinisikan "pulau delta".
Saat menemukan basis delta, kami tidak mengizinkan objek di luar pulau yang sama untuk dianggap sebagai basisnya.Jadi "pulau delta" adalah cara untuk menyimpan objek dari fork yang berbeda dalam repositori dan file paket yang sama tanpa harus memiliki delta di antara objek dari fork yang berbeda.
Patch ini mengimplementasikan mekanisme pulau delta di "
delta-islands.{c,h}
", tetapi belum memanfaatkannya.Beberapa kolom baru ditambahkan di '
struct object_entry
' di "pack-objects.h
" meskipun.
Lihat Documentation/git-pack-objects.txt
:Pulau Delta:
PULAU DELTA
Jika memungkinkan,
pack-objects
mencoba menggunakan kembali delta pada disk yang ada untuk menghindari keharusan mencari yang baru dengan cepat. Ini adalah pengoptimalan penting untuk menyajikan pengambilan, karena ini berarti server dapat menghindari penggelembungan sebagian besar objek sama sekali dan hanya mengirim byte langsung dari disk.Pengoptimalan ini tidak dapat berfungsi saat objek disimpan sebagai delta terhadap basis yang tidak dimiliki penerima (dan yang belum kami kirim). Dalam hal ini server "merusak" delta dan harus mencari yang baru, yang memiliki biaya CPU yang tinggi. Oleh karena itu penting untuk kinerja bahwa kumpulan objek dalam hubungan delta pada disk cocok dengan apa yang akan diambil oleh klien.
Dalam repositori normal, ini cenderung bekerja secara otomatis.
Objek sebagian besar dapat dijangkau dari cabang dan tag, dan itulah yang diambil klien. Setiap delta yang kami temukan di server kemungkinan berada di antara objek yang dimiliki atau akan dimiliki klien.Namun dalam beberapa penyiapan repositori, Anda mungkin memiliki beberapa grup tip referensi yang terkait tetapi terpisah, dengan klien cenderung mengambil grup tersebut secara mandiri.
Misalnya, bayangkan Anda menghosting beberapa "garpu" repositori dalam satu penyimpanan objek bersama, dan membiarkan klien melihatnya sebagai repositori terpisah melalui GIT_NAMESPACE atau repositori terpisah menggunakan mekanisme alternatif.
Pengemasan ulang yang naif mungkin menemukan bahwa delta optimal untuk suatu objek bertentangan dengan basis yang hanya ditemukan di cabang lain.
Namun saat klien mengambil, mereka tidak akan memiliki objek dasar, dan kita harus menemukan delta baru dengan cepat.Situasi serupa mungkin terjadi jika Anda memiliki banyak referensi di luar
refs/heads/
danrefs/tags/
yang mengarah ke objek terkait (mis.,refs/pull
ataurefs/changes
digunakan oleh beberapa penyedia hosting). Secara default, klien hanya mengambil kepala dan tag, dan delta terhadap objek yang hanya ditemukan di grup lain tersebut tidak dapat dikirim apa adanya.Pulau delta mengatasi masalah ini dengan mengizinkan Anda mengelompokkan referensi ke dalam "pulau" yang berbeda .
Objek paket menghitung objek mana yang dapat dijangkau dari pulau mana, dan menolak membuat delta dari objek
A
terhadap basis yang tidak ada di semuaA
pulau-pulau. Ini menghasilkan paket yang sedikit lebih besar (karena kami kehilangan beberapa peluang delta), tetapi menjamin bahwa pengambilan satu pulau tidak perlu menghitung ulang delta dengan cepat karena melewati batas pulau.
Efek sampingnya:beberapa perintah lebih bertele-tele. Git 2.23 (Q3 2019) memperbaikinya.
Lihat komit bdbdf42 (20 Jun 2019) oleh Jeff King (peff
).
delta-islands
:menghormatiprogress
benderaKode pulau delta selalu mencetak "
Marked %d islands
", meskipun kemajuan telah ditekan dengan--no-progress
atau dengan mengirimkan stderr ke non-tty.Mari berikan
progress
boolean keload_delta_islands()
.
Kita sudah melakukan hal yang sama untuk progress meter diresolve_tree_islands()
.
Saya telah memutuskan untuk melakukan ini:
shared-objects-database.git/
foo.git/
objects/info/alternate (will have ../../shared-objects-database.git/objects)
bar.git/
objects/info/alternate (will have ../../shared-objects-database.git/objects)
baz.git/
objects/info/alternate (will have ../../shared-objects-database.git/objects)
Semua garpu akan memiliki entri dalam file objek/info/alternatifnya yang memberikan jalur relatif ke repositori database objek.
Penting untuk menjadikan database objek sebagai repositori, karena kita dapat menyimpan objek dan referensi dari pengguna yang berbeda yang memiliki repositori dengan nama yang sama.
Langkah-langkah:
git init --bare shared-object-database.git
-
Saya menjalankan baris kode berikut baik setiap kali ada dorongan ke garpu mana pun (melalui post-recieve) atau dengan menjalankan cronjob
for r in list-of-forks do
(cd "$r" &&git push ../shared-objects-database.git "refs/:refs/remotes/$r/ " &&echo ../../shared-objects-database.git/objects>objects/info/alternates# untuk disimpan Saya menambahkan objek "gemuk" ke alternatif setiap waktu)selesai
Kemudian di "git gc" selanjutnya semua objek di fork yang sudah ada di alternate akan dihapus.
git repack -adl
juga merupakan pilihan!
Dengan cara ini kami menghemat ruang sehingga dua pengguna yang mendorong data yang sama pada garpu masing-masing di server akan berbagi objek.
Kita perlu mengatur gc.pruneExpire
variabel hingga never
di database objek bersama. Hanya untuk aman!
Untuk sesekali memangkas objek, tambahkan semua garpu sebagai remote ke shared, fetch, dan pangkas! Git akan melakukan sisanya!
(Akhirnya saya menemukan solusi yang cocok untuk saya! (Tidak diuji dalam produksi! :p Berkat postingan ini.)