GNU/Linux >> Belajar Linux >  >> Linux

Hapus duplikat Git fork di server

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/ dan refs/tags/ yang mengarah ke objek terkait (mis., refs/pull atau refs/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 semua A 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 :menghormati progress bendera

Kode 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 ke load_delta_islands() .
Kita sudah melakukan hal yang sama untuk progress meter di resolve_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:

  1. git init --bare shared-object-database.git
  2. 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.)


Linux
  1. Terhubung ke server cloud

  2. Buat Server DNS

  3. Memecahkan masalah SSH

  1. Cara Menginstal HTTP Git Server dengan Nginx di Ubuntu 20.04

  2. Nyalakan ulang server

  3. Git Clone Fails:Verifikasi Sertifikat Server Gagal

  1. Cara Menginstal HTTP Git Server Dengan Nginx di Ubuntu 16.04

  2. Cara Menginstal HTTP Git Server dengan Nginx di Debian 11

  3. Git Pelengkapan otomatis?