Git-merge Ve veřejných holé repos

0

Otázka

Weby jako GitHub a GitLab poskytují způsoby, jak sloučit poboček přímo v jejich webovém rozhraní. Vzhledem k tomu, že tyto stránky ukládat pouze holé repo operace, jak se provádějí ty splývá? Můžete to samé provést na příkazovém řádku v holé clone? Našel jsem to jako možnou odpověď pomocí instalatérské příkazy.

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

Nejlepší odpověď

3

Protože GitHub je uzavřený zdroj, nemůžeme s jistotou říci, jak přesně jejich backend zpracovává operace sloučení. Nicméně, GitLab je Open Source a my můžeme nahlédnout na implementační detaily, které se změnily v průběhu času.

Jak GitLab to

Dnes, většina git-související funkce, které jsou vynořil v UI, včetně git splývá na GitLab jsou zpracovány gitaly součástí GitLab, který interaguje s fyzickým úložiště git repozitářů. Je to v první řadě používá závislý knihovna, git2go, pro provádění skutečné git operace.

Při bližším pohledu na zdrojový kód gitalynejlepší hodnocení můžu udělat je, že gitaly vlastně dělá , aby rozsáhlé využívání pracovní stromů pro git operace, včetně splývá. Repozitářů a pracuje stromy jsou obecně otevřeny a klonovány do "karantény" adresářů, které jsou jen temp adresáře na-the-fly a úložiště pracuje strom je klonován do temp adresáře. (viz karantény.go#L40-58, volal z sloučit.go#L53).

jak se provádějí ty splývá?

Takže, abych odpověděl na vaši otázku: alespoň s GitLab, pracovní stromů jsou použity pro sloučení (kromě jiných operací) a nejsou prováděny v bare repozitáře. Ty to jen nevidíš je, protože dočasné adresáře jsou použity předtím, než jsou spáchány na skutečnou cestu úložiště.

Můžeme snad předpokládat, že GitHub má něco podobného, ale to je nemožné vědět, pro jistotu.

Může to být provedeno?

Můžete to samé provést na příkazovém řádku v holé clone?

Jste poukázal na jeden příklad, který se zdá k práci, aniž by mimo kontrolu pracovní strom? Ale funguje to tím, že psaní stromu (pomocí git write-tree), která na praktické úrovni se nezdá mít žádnou výhodu, říká klonování z holé repo a odhlašování pracovní strom a pomocí git operace obvykle. Pro výkon (předvídat možné námitky), můžete použít tempfs nebo nějaké jiné paměti mapované umístění.

Jsem také jisti, že spojené odpověď by být dostačující pro provádění různých sloučit strategie používané git merge.

Takže, na formalitě, možná? Odpověď souvisí se zdá, na tuto otázku odpovědět. Na praktické úrovni, že by bylo užitečné, ne, to tak nevypadá.

2021-11-24 00:59:11

Díky za sledování dolů ty kousky kódu. Vypadají jako důkaz pro jedno použití, non-holé klon. Zajímavé je, že tyto čáry vypadají, že mohou být se snaží sdílet objekty z holé repo v klonových, možná pro výkon. Připomíná mi to git clone --shared.
Jim

@Jim hmmm. Nejsem si 100% jistý. Na základě čtení, to vypadá jako relativePath v tomto případě je dočasný adresář, který je vytvořen relativní k repo na disku. Vypadá to, že klonování repo, pak převažující předmět cestu (quarantinedRepo.GitObjectDirectory = relativePath) v quarantineRepo objekt poukázat na tempdir (jako protiklad k tomu, co předpokládám, že je výchozí pro aktuální repo je umístění objektů vrátil z klonu metoda).
sytech

V jiných jazycích

Tato stránka je v jiných jazycích

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