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.
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 gitaly
najlepsza 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ę.
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 = relativePath
w 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).
git clone --shared
.