Como configurar um projeto git para usar um submódulo de repositório externo?

213

Gostaria de criar um repo que atraia um repo remoto.

Por exemplo, digamos jQuery como um submódulo:

git://github.com/jquery/jquery.git

Qual seria o processo de criar um repositório com o jQuery como um submódulo e adicionar meu próprio externo como um repositório remoto.

Além disso, depois de configurada, se eu pressionar / puxar para o meu próprio controle remoto, o externo permanecerá intacto?

Tom
fonte
1
Quando você diz "puxar", está dizendo que deseja que o repositório jQuery seja um submódulo do seu próprio repositório?
ezod
Sim exatamente, desculpe se isso não estiver claro. Eu gostaria de saber como eu configuro isso como externo enquanto pressiono e puxo alterações no meu controle remoto
Tom
Veja o Tutorial do Sub-módulo Git no wiki do git.
Greg Bacon

Respostas:

343
  1. Você tem um projeto - chame-o MyWebApp que já possui um repositório no github
  2. Você deseja usar o repositório jquery em seu projeto
  3. Você deseja puxar o repositório jquery para o seu projeto como um submódulo .

Os submódulos são muito, muito fáceis de referenciar e usar. Supondo que você já tenha o MyWebApp configurado como um repositório, no terminal emita estes comandos:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Isso criará um diretório chamado externals/jquery* e o vinculará ao repositório github jquery. Agora só precisamos iniciar o submódulo e clonar o código para ele:

git submodule update --init --recursive

Agora você deve ter todo o código mais recente clonado no submódulo. Se o repositório jquery mudar e você desejar extrair o código mais recente, basta emitir o submodule updatecomando novamente. Observação: normalmente tenho vários repositórios externos em meus projetos, por isso sempre agrupo os repositórios em um diretório "externos".

O Pro Git Book on-line possui algumas boas informações sobre submódulos (e git em geral) apresentados de maneira fácil de ler. Como alternativa, git help submoduletambém dará boas informações. Ou dê uma olhada no Tutorial do Sub-módulo Git no wiki do git.

Notei esta entrada do blog que fala sobre submódulos e os compara ao mecanismo svn: externals do Subversion: http://speirs.org/blog/2009/5/11/11/understanding-git-submodules.html

* Como prática recomendada, você sempre deve colocar seus submódulos em seu próprio diretório, como Externals. Caso contrário, o diretório do projeto raiz pode ficar muito confuso, muito rápido.

memmons
fonte
4
Ótima explicação! :) Além disso, o "git help submodules" ajuda se você quiser um pouco mais de detalhes, internos, etc.
WhyNotHugo
2
Obrigado, exatamente o que eu precisava.
21813 MikeSchinkel
1
@Chevi Depende de suas necessidades. Em geral, adicionar um projeto git como um submódulo ao seu projeto é uma boa solução para projetos que mudam frequentemente ou ainda estão em desenvolvimento. Isso permite garantir facilmente que todo o código de terceiros no seu projeto esteja atualizado. Para código de terceiros que é essencialmente estático - código estável e maduro que provavelmente não mudará muito de versão para versão - o uso de um submódulo não fornece muito valor.
memmons
2
desculpe mas em comparação com externals svn, não é assim tão fácil
Keil
2
@ Keil São dois comandos, git submodule adde git submodule update... não sei o quanto mais fácil isso poderia ser.
memmons
24

A maior parte do que você precisa saber já foi respondida, por isso não me incomodarei em abordar isso; no entanto, encontrei um pequeno pedaço de informação que geralmente está faltando.

Como você sabe, "git pull" não atualizará os submódulos e "git submódulos update" também não baixará o HEAD mais recente desses submódulos.

Para atualizar todos os seus submódulos para a última revisão upstream, você pode usar

git submodule foreach git pull

Se você costuma alterar seus submódulos e possui muitos, o "git foreach" se tornará inestimável.

WhyNotHugo
fonte
0

Acho que a resposta @Hugo pode ser o que você precisa e funciona bem. Então, eu encontrei uma maneira mais fácil.

git submodule update --remote

Isso é tudo.

Portanto, um fluxo de trabalho completo pode ser:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Dapaldo
fonte