Git-scalanie W publicznych otwartych repozytoriach

0

Pytanie

Strony takie jak GitHub i GitLab, zapewniają sposoby łączenia gałęzi bezpośrednio w swoim interfejsie. Biorąc pod uwagę, że na tych stronach są przechowywane tylko gołe repozytorium, jak wykonują te korespondencji seryjnej? Czy można to samo zrobić w wierszu polecenia w celu klonu? Znalazłem to jako możliwą odpowiedź, za pomocą zespołu urządzeń sanitarnych.

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

Najlepsza odpowiedź

3

Ponieważ GitHub jest zamkniętym kodem źródłowym, nie możemy powiedzieć dokładnie, jak ich zaplecza przetwarza operacji scalania. Jednak GitLab ma otwarty kod źródłowy i możemy zapoznać się ze szczegółami realizacji, które z czasem uległy zmianie.

Jak to robi GitLab

Dziś większość funkcji związanych z git, które są wyświetlane w interfejsie użytkownika, w tym fuzji git w GitLab, przetwarzane są składnikiem gitaly GitLab, który komunikuje się z fizycznym magazynem repozytoriów git. W zasadzie wykorzystuje swoją zależną biblioteki git2go do przeprowadzania operacji git.

Patrząc bliżej do kodu źródłowego dla gitalynajlepsza ocena, jaką mogę zrobić, jest to, że gitaly naprawdę szeroko wykorzystuje robocze drzewa operacji git, w tym fuzji. Repozytorium i robocze drzewa są zwykle otwierane i klonowane rekurencyjnie w katalogi "kwarantanny", które są po prostu katalogi tymczasowe, tworzone na bieżąco, a drzewa roboczego repozytorium klonowane do katalogu tymczasowego. (patrz kwarantannie.go#L40-58, dzwoniącego z merge.go#L53).

jak wykonują te korespondencji seryjnej?

Tak więc, aby odpowiedzieć na twoje pytanie: co najmniej w GitLab robocze drzewa są używane do fuzji (wśród innych operacji) i nie są wykonywane w pustych repozytoriach. Po prostu ich nie widać, bo tymczasowe katalogi są używane do tego, jak będą przywiązani do faktycznego drodze do magazynu.

Być może, możemy założyć, że GitHub robi coś takiego, ale nie wiadomo na pewno.

Czy można to zrobić?

Czy można to samo zrobić w wierszu polecenia w celu klonu?

Podałeś jeden przykład, który, wydaje się, działa bez sprawdzania roboczego drzewa? Ale to działa, wypisując drzewo (za pomocą git write-tree), który na poziomie praktycznym, jak się wydaje, nie ma żadnych zalet, powiedzmy, przed klonowaniem z prostego repo, walidacji pracy drewna i pomocą git działa normalnie. W celu zwiększenia wydajności (przewidując ewentualne zastrzeżenia) można użyć tymczasowe pliki lub jakiekolwiek inne miejsce, korelującego z pamięcią.

Ja również nie jestem pewien, co związane odpowiedzi będą wystarczające dla realizacji różnych strategii fuzji używanych git merge.

Tak, może być, na formalności? Odpowiedź, którą jesteś związany, jak się wydaje, dobrze odpowiada na to pytanie. Na poziomie praktycznym, to byłoby pomocne, nie, nie wydaje mi się.

2021-11-24 00:59:11

Dziękuję, że poszedłeś te fragmenty kodu. Są one naprawdę wyglądają jak dowody dla jednorazowego, nie gołego klonu. Ciekawe, że te linie wyglądają tak, jakby były, być może, starają się podzielić, jak z nagiego repo, w tym klonie, być może, w celu zwiększenia wydajności. To przypomina mi o git clone --shared.
Jim

@Jim hmmm. Nie jestem pewien na 100%. Opierając się na moim czytaniu, to wygląda tak relativePath w tym przypadku jest to katalog tymczasowy, który tworzony jest stosunkowo repo na dysku. Wygląda na to, że klonuje repozytorium, a następnie zastępuje drogę do obiektu (quarantinedRepo.GitObjectDirectory = relativePathw quarantineRepo obiekt wskazujący na tempdir (w przeciwieństwie do tego, co myślę, jest wartością domyślną dla lokalizacji obiektów rzeczywistych repozytorium, zwróconego przez metodę klonowania).
sytech

W innych językach

Ta strona jest w innych językach

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