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?

adamyonk
fonte

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.

mipadi
fonte
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.

JohnO
fonte
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.

kubi
fonte
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.

Cola
fonte