Executando verificação de segurança...
6

Git: Como Lidar com Múltiplos Repositórios na Mesma Pasta (sem submodules)

Sim, eles são simples e a solução de fato para trabalhar com múltiplos repositórios Git no mesmo diretório. Mas usar usar as "tecnologias modernas" vai te mostrar que, às vezes, as coisas mais simples não funcionam.

Pegue a extensão cpptools do VSCode, por exemplo. Links simbólicos quebram as coisas. A extensão tem mais de 1.400 issues abertas, e links simbólicos são um problema recorrente. A solução segundo a Microsoft? Resolver os caminhos antes de abrir o workspace. O workaround mais simples é mount --bind — uma maneira mais robusta de lidar com caminhos de arquivos. Mas vamos deixar isso de lado por enquanto...

Sempre soube que o Git é essencialmente um sistema de arquivos com uma API de controle de versão por cima e sempre quis aprender mais sobre os "internos" do Git, mas, honestamente, seis comandos sempre foram suficientes para mim: push, pull, commit, status, branch e checkout. Mas será que podemos resolver esse problema apenas com o Git? Hora de mergulhar mais fundo. Peguei o livro Pro Git no fim de semana e tentei algo.

Git Read-Tree e Rebase

Aqui está a ideia geral:

  • git read-tree permite carregar múltiplos branches (cada um rastreando um repositório upstream) em um único diretório de trabalho. Cada branch que representada um repo é "montado" neste único branch de trabalho como uma árvore separada, dando acesso aos arquivos de múltiplos repositórios sem a bagunça dos submódulos.

  • Você faz mudanças no seu branch de trabalho, comita conforme necessário em vários "repositórios" sem quaisquer preocupações. Todas os commits acontecem neste ambiente isolado.

  • Quando estiver pronto, crie um branch temporário para "reverter" a operação do read-tree. Isso garante que os caminhos corretos sejam preparados e staged no seu repositório.

  • Finalmente, faça um rebase das mudanças staged no branch alvo, mantendo um histórico de commits limpo e linear. Isso garante que suas mudanças sejam aplicadas no topo dos commits mais recentes dos repositórios upstream.

Esse método é muito mais direto do que lidar com submódulos, que geralmente introduzem complexidade e confusão. Uma vez que você entende conceitos como rebase e objetos de árvore no Git, fica claro como essa solução funciona. Depois de me acostumar, comecei a me perguntar: por que submódulos ainda existem?

Git Como um Sistema de Arquivos

A beleza do git read-tree está na sua flexibilidade. Ele não permite apenas "montar" commits ou branches inteiros — você também pode especificar caminhos dentro desses commits ou branches e montá-los onde quiser no seu projeto. Isso oferece um controle incrível, permitindo que você lide com layouts complexos de repositórios sem nenhum esforço.

Por exemplo, usando a opção --prefix, você pode isolar e trazer apenas diretórios ou arquivos específicos de um repositório upstream e colocá-los exatamente onde quiser no seu projeto:

git read-tree --prefix=vendor/third-party -u upstream_repo/branch:path/to/lib

Além disso, há outro comando poderoso no Git: git worktree que permite fazer checkout de branches em diretórios separados. Isso é particularmente útil para manter seus "branches de rastreamento upstream" montados em algum lugar, enquanto seu diretório principal do projeto fica livre de bagunça. Para mudar fazer um checkout neste branch, basta dar um cd para sua pasta.

git worktree add repos/upstream branch-that-tracks-upstream

Combinando git read-tree e git worktree, você ganha flexibilidade máxima. Você pode usar worktreepara gerenciar branches em diretórios separados, e read-tree para montar dinamicamente partes específicas de repositórios remotos no seu diretório de trabalho.

Essa abordagem ajuda a gerenciar até os projetos mais complexos de múltiplos repositórios sem depender de submódulos. Sim, há uma sobrecarga envolvida na sincronização, mas é limpo e direto, fácil de entender e de scriptar.

Moral da História

Isso não é um tutorial — nem tente esses comandos. Mas, vá entendê-los. Como diria Tim Maia, "Leia o livro!". Pare de copiar comandos do GePeTo sem pensar. Peça ajuda para entender o problema e as ferramentas que você tem. Quando fizer isso, você vai criar seus próprios comandos para resolver seus problemas!

Carregando publicação patrocinada...
2

Quantas vezes precisei entender essa estrutura e na preguiça, acabei fazendo um novo repositório. MAs seu texto já dá um gatilho para compreensão, mesmo com seu aviso que não é um tutorial, foi bem útil a leitura sim!

2

Gostei muito do artigo.

Estou desenvolvendo um framework modular que se relaciona bem com o tema de múltiplos repositórios. Em breve, vou compartilhar mais detalhes.

em resumo, o repositório do projeto vem limpo.
Caso o desenvolvedor queira usar algum módulo (API, Front, Banco de dados ...) ele pode puxar esse modulo usando repositorios remotos.

Essa alternativa não funciona bem para a mesma pasta. mas é boa para quem quer algo mais simples por pasta.
Um repositório de repositoriós.