Git-kamu çıplak repolarında birleştir

0

Soru

GitHub ve GitLab gibi siteler, şubeleri doğrudan web arayüzlerinde birleştirmenin yollarını sunar. Bu sitelerin yalnızca çıplak repoları depoladığı göz önüne alındığında, bu birleştirmeleri nasıl gerçekleştirirler? Aynı şey komut satırında çıplak bir klonda da yapılabilir mi? Bunu sıhhi tesisat komutlarını kullanarak olası bir cevap olarak buldum.

git github gitlab merge
2021-11-23 22:52:54
1

En iyi cevabı

3

GitHub kapalı kaynak olduğundan, arka uçlarının birleştirme işlemlerini tam olarak nasıl işlediğini tam olarak söyleyemeyiz. Bununla birlikte, GitLab Açık Kaynaktır ve zaman içinde değişen uygulama ayrıntılarına göz atabiliriz.

GitLab bunu nasıl yapar

Bugün, gitlab'da git birleştirmeleri de dahil olmak üzere kullanıcı arayüzünde ortaya çıkan git ile ilgili özelliklerin çoğu, git depolarının fiziksel depolamasıyla etkileşime giren Gitlab'ın gitaly bileşeni tarafından ele alınmaktadır. Esas olarak gerçek git işlemlerini gerçekleştirmek için bağımlı kitaplığı git2go'yu kullanır.

Kaynak koduna daha yakından bakmak gitaly yapabileceğim en iyi değerlendirme, gitaly'nin aslında birleştirmeler de dahil olmak üzere git işlemleri için çalışma ağaçlarını kapsamlı bir şekilde kullanmasıdır. Depolar ve çalışma ağaçları genellikle açılır ve "karantina" dizinlerine klonlanır; bunlar yalnızca anında yapılan geçici dizinlerdir ve deponun çalışma ağacı geçici dizine klonlanır. karantina.git # L40-58, birleşmeden aranıyor.git#L53).

bu birleşmeleri nasıl gerçekleştiriyorlar?

Yani, sorunuzu cevaplamak için: en azından GitLab ile çalışma ağaçları birleştirmeler için kullanılır (diğer işlemlerin yanı sıra) ve çıplak depolarda gerçekleştirilmez. Geçici dizinler gerçek depo yoluna bağlanmadan önce kullanıldığından bunları görmezsiniz.

Belki de Github'ın benzer bir şey yaptığını varsayabiliriz, ancak kesin olarak bilmek imkansızdır.

Bu yapılabilir mi?

Aynı şey komut satırında çıplak bir klonda da yapılabilir mi?

Seni sivri bir örnek bu gibi görünüyor için çalışma olmadan kontrol etmeye çalışan bir ağaç. Ancak ağacı yazarak (kullanarak) çalışır git write-tree), pratik düzeyde herhangi bir avantaja sahip görünmüyor, çıplak repodan klonlama ve çalışma ağacını kontrol etme ve kullanma git normal işlemler. Performans için (olası itirazları öngörerek) tempfs veya başka bir bellek eşlemeli konum kullanabilirsiniz.

Ayrıca, bağlantılı cevabın, tarafından kullanılan çeşitli birleştirme stratejilerini yürütmek için yeterli olacağından emin değilim git merge.

Teknik olarak belki? Bağladığınız cevap bu soruya iyi cevap veriyor gibi görünüyor. Pratik bir düzeyde, bu yararlı olurdu, hayır, öyle görünmüyor.

2021-11-24 00:59:11

Kod parçacıklarının izini sürdüğün için teşekkürler. Atılmış, çıplak olmayan bir klon için kanıt gibi görünüyorlar. İlginç bir şekilde, bu satırlar, belki de performans için klondaki çıplak repodan nesneleri paylaşmaya çalışıyor gibi görünüyorlar. Bana hatırlatıyor git clone --shared.
Jim

@Jim hmmm. % 100 emin değilim. Okuduğuma göre, şöyle görünüyor: relativePath bu durumda, diskteki repoya göre oluşturulan geçici dizindir. Repoyu klonlamak, ardından nesne yolunu geçersiz kılmak gibi görünüyor (quarantinedRepo.GitObjectDirectory = relativePath) içinde quarantineRepo tempdir'e işaret edecek nesne (gerçek repo'nun clone yönteminden döndürülen nesne konumunun varsayılanı olduğunu varsaydığımın aksine).
sytech

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................