Esta versão do GitHub Enterprise foi descontinuada em 2021-09-23. Nenhum lançamento de patch será feito, mesmo para questões críticas de segurança. Para obter melhor desempenho, melhorar a segurança e novos recursos, upgrade to the latest version of GitHub Enterprise. Para ajuda com a atualização, contact GitHub Enterprise support.

Sobre merges de subárvore do Git

Se precisar gerenciar vários projetos em um único repositório, você poderá usar um merge de subárvore para manipular todas as referências.

Sobre merges de subárvore

Normalmente, um merge de subárvore é usado para conter um repositório dentro de outro repositório. O "sub-repositório" é armazenado em uma pasta do repositório principal.

A melhor maneira de explicar merges de subárvore é mostrar com exemplo. O que faremos:

  • Criar um repositório vazio chamado test que represente nosso projeto
  • Fazer merge de outro repositório nele como uma subárvore chamada Spoon-Knife.
  • O projeto test usará esse subprojeto como se ele fosse parte do mesmo repositório.
  • Fazer fetch de atualizações em Spoon-Knife em nosso projeto test.

Configurar o repositório vazio para um merge de subárvore

  1. Abra TerminalTerminalGit Bash.
  2. Crie um novo diretório e navegue até ele.
    $ mkdir test
    $ cd test
  3. Inicialize um novo repositório Git.
    $ git init
    > Initialized empty Git repository in /Users/octocat/tmp/test/.git/
  4. Crie e faça commit de um novo arquivo.
    $ touch .gitignore
    $ git add .gitignore
    $ git commit -m "initial commit"
    > [main (root-commit) 3146c2a] initial commit
    >  0 files changed, 0 insertions(+), 0 deletions(-)
    >  create mode 100644 .gitignore

Adicionar um novo repositório como uma subárvore

  1. Adicione uma nova URL remota apontando para o projeto separado em que estávamos interessados.

    $ git remote add -f spoon-knife git@github.com:octocat/Spoon-Knife.git
    > Updating spoon-knife
    > warning: no common commits
    > remote: Counting objects: 1732, done.
    > remote: Compressing objects: 100% (750/750), done.
    > remote: Total 1732 (delta 1086), reused 1558 (delta 967)
    > Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done.
    > Resolving deltas: 100% (1086/1086), done.
    > From git://github.com/octocat/Spoon-Knife
    >  * [new branch]      main     -> Spoon-Knife/main
  2. Faça merge do projeto Spoon-Knife no projeto Git local. Isso não muda qualquer um de seus arquivos localmente, mas prepara o Git para a próxima etapa.

    Se você estiver usando o Git 2.9 ou superior:

    $ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main
    > Automatic merge went well; stopped before committing as requested

    Se estiver usando o Git 2.8 ou abaixo:

    $ git merge -s ours --no-commit spoon-knife/main
    > Automatic merge went well; stopped before committing as requested
  3. Crie um diretório chamado spoon-knife e copie o histórico do projeto Spoon-Knife do Git nele.

    $ git read-tree --prefix=spoon-knife/ -u spoon-knife/main
  4. Faça commit das alterações para mantê-las seguras.

    $ git commit -m "Subtree merged in spoon-knife"
    > [main fe0ca25] Subtree merged in spoon-knife

Embora tenhamos adicionado apenas um subprojeto, qualquer número de subprojetos pode ser incorporado a um repositório Git.

Dica: se, futuramente, você criar um clone do repositório, os remotes adicionados não serão criados para você. Será preciso adicioná-los novamente usando o comando git remote add.

Sincronizar com atualizações e alterações

Quando um subprojeto é adicionado, ele não é mantido automaticamente em sincronia com as alterações de upstream. Você precisará atualizar o subprojeto com o seguinte comando:

$ git pull -s subtree remotename branchname

Para o exemplo acima, o comando seria:

$ git pull -s subtree spoon-knife main

Leia mais