Git-fusion En public, nu repos

0

La question

Des Sites comme GitHub et GitLab fournir des façons de fusionner les branches directement dans leur interface web. Étant donné que ces sites en magasin seulement nu repos, comment font-ils pour effectuer ces fusions? La même chose sera fait sur la ligne de commande dans un simple clone? J'ai trouvé cela comme une réponse possible à l'aide de la plomberie commandes.

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

La meilleure réponse

3

Parce que GitHub est à code source fermé, nous ne pouvons pas dire exactement comment leur backend gère les opérations de fusion. Cependant, GitLab est Open Source et nous pouvons apercevoir les détails de mise en œuvre, qui ont changé au fil du temps.

Comment GitLab t-il

Aujourd'hui, la plupart git liés à des caractéristiques qui sont apparues dans l'INTERFACE utilisateur, y compris git fusionne sur GitLab sont traitées par le gitaly composant de GitLab, qui interagit avec le physique de stockage des dépôts git. Il utilise principalement son dépendante de la bibliothèque, git2go, pour l'exécution réelle git opérations.

En regardant de plus près le code source pour gitalyla meilleure évaluation que je puisse faire est que gitaly en fait ne font une utilisation intensive de travail les arbres pour git opérations, y compris pour les fusions. Les référentiels de travail et les arbres sont en général ouvert et cloné à la "mise en quarantaine" des répertoires, qui sont juste des répertoires temp fait à la volée et le référentiel de l'arbre de travail est cloné dans le répertoire temp. (voir la quarantaine.allez#L40-58, appelé à partir de la fusion.allez#L53).

comment font-ils pour effectuer ces fusions?

Donc, pour répondre à votre question: au moins avec GitLab, de travail les arbres sont utilisés pour les merges (entre autres) et ne sont pas effectuées en nue-dépôts. Vous venez de ne pas les voir, parce répertoires temporaires sont utilisés avant qu'ils ne soient commis à l'actuel chemin du référentiel.

Nous pouvons peut-être supposer que GitHub fait quelque chose de similaire, mais il est impossible de le savoir.

Peut-il être fait?

La même chose sera fait sur la ligne de commande dans un simple clone?

Vous avez évoqué un exemple qui semble fonctionner sans la vérification d'un arbre de travail? Mais il fonctionne par écrit de l'arbre (à l'aide de git write-tree), qui, sur un plan pratique ne semble pas avoir un avantage par rapport à, disons le clonage à partir de la nue-pensions et de la vérification de l'arbre de travail et à l'aide de git les opérations normalement. Pour les performances (en anticipant les objections possibles), vous pouvez utiliser tempfs ou certains autres mappés en mémoire l'emplacement.

Je suis également pas sûr que lié, la réponse devrait être suffisant pour la réalisation de différents fusionner les stratégies utilisées par les git merge.

Donc, sur une technicité, peut-être? La réponse vous semble lié à répondre à cette question. Sur un plan pratique, ce serait utile, non, il ne semble pas si.

2021-11-24 00:59:11

Merci pour la traque de ces extraits de code. Ils ne regardent pas comme une évidence pour un jetable, non-nue clone. Fait intéressant, ces lignes se ressemblent, ils tentent peut-être de partager les objets de la nue-pensions dans le clone, peut-être pour la performance. Il me rappelle git clone --shared.
Jim

@Jim hmmm. Je ne suis pas sûr à 100%. Basé sur ma lecture, ça ressemble à relativePath dans ce cas, est le répertoire temporaire, qui est créé par rapport à des pensions de titres sur le disque. On dirait que c'est de cloner le repo, puis en substituant le chemin de l'objet (quarantinedRepo.GitObjectDirectory = relativePath) dans le quarantineRepo objet pour pointer vers le répertoire temp (contrairement à ce que je suppose est la valeur par défaut de l'effectif des pensions de titres, les objets de l'emplacement retourné à partir de la méthode clone).
sytech

Dans d'autres langues

Cette page est dans d'autres langues

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