Manter o repositório git dentro de outro repositório git


124

Aqui está o que eu gostaria:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Desejo poder enviar todo o conteúdo do REPO-A para o REMOTE-A e apenas o REPO-B para o REMOTE-B.

Possível?

Respostas:


104

Parece que você deseja usar os submódulos do Git .

O Git soluciona esse problema usando submódulos. Os submódulos permitem manter um repositório Git como um subdiretório de outro repositório Git. Isso permite que você clone outro repositório em seu projeto e mantenha seus commits separados.


19
Não exatamente: não empurrará todo o conteúdo do repoA: apenas A mais uma referência a B. Mas eu não critico sua resposta, eu estava correndo escrevendo da mesma maneira quando reli a pergunta do OP;)
— VonC

1
Esse é praticamente o caso de uso para submódulos. O REPO-A e o REPO-B são tratados como repositórios git por si mesmos, com seus próprios commits, origens, história, etc. #
— Damien Wilson

2
portanto, se estou lendo isso corretamente, posso verificar independentemente um repositório de submódulo-d completamente fora daquele em que o encontro? Como eu pegaria um repositório já existente e o referenciaria como um submódulo em outro projeto?
— Johno

eu não estava procurando exatamente a mesma solução que o OP e, em média, acho que essa é provavelmente uma resposta mais pesquisada para uma pergunta semelhante: "colocar o git REPO-B no git REPO-A incorpora uma referência ou uma cópia completa do git REPO-B? ".
— Jaya

64

Eu sempre usei links simbólicos para manter dois repositórios separados e distintos.


8
para quão confusos os submódulos e subárvore git parecem ser, essa é uma resposta válida.
— Trevor Hickey

Isso também é muito útil para montar um aplicativo a partir de vários repositórios remotos
— GeraldScott 25/16/16

22
Para manter dois repositórios separados e distintos, não seria bom manter o repositório B no repositório A e simplesmente adicionar o repositório B aos repositórios A .gitignore?
— Fabien Snauwaert

1
Eu estava pensando em fazer o que Fabien sugere, há algum problema em fazê-lo dessa maneira?
— theonlygusti

1
Eu mantenho os repositórios git separados e copio as alterações feitas no REPO-B em uma cópia do REPO-B (sem .git) aninhada no REPO-A. Eu faço isso com o rsync. Eu corro rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/depois que houver alguma alteração no REPO-B
— Shai

29

Sim, você pode fazer exatamente o que está pedindo com a hierarquia de arquivos que você desenhou. O Repo-B será independente e não tem conhecimento do Repo-A. O Repo-A acompanhará todas as alterações em seus próprios arquivos e nos arquivos do Repo-B.

No entanto, eu não recomendaria fazer isso. Toda vez que você alterar arquivos e confirmar no Repo-B, terá que confirmar no Repo-A. A ramificação no Repo-B interferirá no Repo-A e a ramificação no Repo-A será instável (problemas para remover pastas, etc.). Os submódulos são definitivamente o caminho a percorrer.


53
Você não pode simplesmente adicionar o REPO-B ao /REPO-A/.gitignore?
— Mikkelbreum

2
@mikkelbreum Eu tive exatamente a mesma idéia. No momento, estamos usando subverion para o nosso projeto principal e usamos um repositório git em uma das subpastas. Com o SVN, adicionei a pasta com o repo git à propriedade svn: ignore e estava me perguntando se posso fazer o mesmo com o git.
— 2ndkauboy

3
Bem, eu não consigo entender por que a adição de um repositório git aninhado à lista de ignorados do repositório pai não deve funcionar. raramente visto sugerido, e muitas pessoas desencorajam repositórios aninhados de git.
— mikkelbreum

18
Acabei de implementar esse cenário exato. Eu tenho alguns arquivos CSS descompactados em uma subpasta que não quero que sejam enviados para o repositório remoto, por isso está no meu .gitignore. Mas eu quero acompanhar as alterações nesses arquivos localmente. Configurei um repositório dentro da pasta com os arquivos não compactados e adicionei todos os arquivos a esse repositório. Ele ainda é ignorado pelo repositório pai, mas posso acompanhar as alterações dentro do subdiretório. Recomendado ou não, esta solução é essencial para determinadas situações como esta.
— BrianVPS 4/15

1
Entendo que sempre que você alternar ramificações em um repositório, o outro verá várias alterações, mas por que "a ramificação no Repo-A será instável (problemas para remover pastas etc.)."? THX!
— User2688151

2

Você pode conseguir o que deseja (esse repositório REPO-A contém todos os arquivos, incluindo os da pasta REPO-B em vez de apenas uma referência) usando "git-subrepo":

https://github.com/ingydotnet/git-subrepo

Ainda funciona se alguns de seus colaboradores não tiverem o comando subrepo instalado; eles verão a estrutura completa da pasta, mas não poderão confirmar alterações nos sub-repositórios.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.