Git merge Em público nua acordos de recompra

0

Pergunta

Sites como GitHub e GitLab fornecem meios para mesclar ramos diretamente na interface da web. Tendo em conta que os sites armazenam apenas nua acordos de recompra, como eles executam essas mescla? É possível que a mesma coisa que ser feito na linha de comando em um simples clone? Eu encontrei esta como uma possível resposta usando o encanamento de comandos.

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

Melhor resposta

3

Porque o GitHub é de código fechado, não podemos dizer com certeza, exatamente como seu back-end lida com operações de impressão. No entanto, GitLab é Open Source e podemos espiar os detalhes de implementação, que mudaram ao longo do tempo.

Como GitLab não

Hoje, a maioria git-os recursos relacionados, que são apresentados na INTERFACE do usuário, incluindo o git diretas em GitLab são manipulados pelo gitaly componente do GitLab, que interage com o meio físico de armazenamento de repositórios git. Ele usa principalmente seus dependentes biblioteca, git2go, para a realização de reais git operações.

Olhando mais de perto o código-fonte de gitalya melhor avaliação que posso fazer é que gitaly, na verdade, não fazem uso extensivo do trabalho de árvores para o git operações, incluindo para a mescla. Repositórios e de trabalho árvores são geralmente aberto e clonadas "quarentena" de diretórios, que são apenas diretórios temporários feitas on-the-fly e o repositório da árvore de trabalho é clonado no diretório temp. (consulte a quarentena.ir#L40-58, chamado de série.ir#L53).

como eles executam essas mescla?

Então, para responder sua pergunta: pelo menos com GitLab, trabalhando árvores são utilizados para funde-se (entre outras operações) e não são realizadas na nua repositórios. Você só não vê porque diretórios temporários são utilizados antes de serem confirmadas para o real caminho de repositório.

Talvez possamos supor que o GitHub faz algo parecido, mas é impossível saber com certeza.

Isso pode ser feito?

É possível que a mesma coisa que ser feito na linha de comando em um simples clone?

Você apontou para um exemplo que parece trabalhar sem verificar uma árvore de trabalho? Mas ele funciona por escrever a árvore (usando git write-tree), que em um nível prático, não parece ter alguma vantagem sobre, digamos, a clonagem a partir do nu repo e conferir a árvore de trabalho, e utilizando a git operações normalmente. Para o desempenho (antecipando possíveis objeções), você pode usar tempfs ou algum outro de memória mapeada localização.

Tenho também a certeza de que vinculada resposta seria suficiente para a realização de diversas mesclar estratégias utilizadas pelos git merge.

Assim, em um vício de forma, talvez? A resposta é vinculada parece responder a essa pergunta. Em um nível prático que poderia ser útil, não, não pareça assim.

2021-11-24 00:59:11

Obrigado por rastrear os trechos de código. Eles olham como evidência para uma descartáveis, não nua clone. Curiosamente, estas linhas olhar como eles podem estar tentando compartilhar os objetos a partir do nu de recompra, em o clone, talvez para o desempenho. Isso me lembra de git clone --shared.
Jim

@Jim hmmm. Eu não tenho 100% de certeza. Com base na minha leitura, parece que relativePath neste caso, é o diretório temporário que é criado em relação ao acordo de recompra no disco. Parece que a clonar o repositório e, em seguida, substituindo o caminho do objeto (quarantinedRepo.GitObjectDirectory = relativePath) no quarantineRepo objeto para apontar para o tempdir (ao contrário do que eu suponho que é o padrão do real repo objetos do local retornado do método clone).
sytech

Em outros idiomas

Esta página está em outros idiomas

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