Estamos usando submódulos git para gerenciar alguns grandes projetos que dependem de muitas outras bibliotecas que desenvolvemos. Cada biblioteca é um repositório separado trazido para o projeto dependente como um submódulo. Durante o desenvolvimento, geralmente queremos apenas pegar a versão mais recente de cada submódulo dependente.
O git tem um comando interno para fazer isso? Caso contrário, que tal um arquivo em lotes do Windows ou similar que possa fazer isso?
git
git-submodules
Brad Robinson
fonte
fonte
Respostas:
Se for a primeira vez que você faz o check-out de um repositório, você precisa
--init
primeiro:Para o git 1.8.2 ou superior, a opção
--remote
foi adicionada para oferecer suporte à atualização das dicas mais recentes de ramificações remotas:Isso tem o benefício adicional de respeitar as ramificações "não padrão" especificadas nos arquivos
.gitmodules
ou.git/config
(se houver alguma, o padrão é origem / mestre; nesse caso, algumas das outras respostas aqui também funcionariam).Para o git 1.7.3 ou superior, você pode usar (mas as dicas abaixo sobre qual atualização ainda se aplica):
ou:
se você deseja puxar seus submódulos para as confirmações mais recentes, em vez da confirmação atual, o repo aponta para.
Veja git-submódulo (1) para detalhes
fonte
git submodule update --recursive
hoje em dia.git submodule foreach "(git checkout master; git pull)&"
origin master
no final deste comando pode ter resultados inesperados se alguns de seus submódulos estiverem rastreando um nome diferente de filial ou local desse submódulo específico. Óbvio para alguns, mas provavelmente não para todos.git submodule update --recursive
procura ver qual revisão o repositório pai armazenou para cada submódulo e depois faz check-out dessa revisão em cada submódulo. Ele não puxar as últimas commits para cada sub-módulo.git submodule foreach git pull origin master
ougit pull origin master --recurse-submodules
é o que você deseja se pretende atualizar cada submódulo para o mais recente a partir de seus repositórios de origem. Somente então você receberá alterações pendentes no repositório pai com hashes de revisão atualizados para submódulos. Verifique aqueles e você é bom.Até que o bug seja corrigido, pela primeira vez você precisa executar
fonte
git pull --recurse-submodules
nemgit submodule update --recursive
que não initialize recém submódulos acrescentou. Para inicializá-los, você precisa executargit submodule update --recursive --init
. Citação do manual : Se o submódulo ainda não foi inicializado e você deseja apenas usar a configuração armazenada em .gitmodules, você pode inicializar automaticamente o submódulo com a opção --init.git submodule update --recursive --remote
qual também atualize os submódulos para a revisão mais recente remota, em vez do SHA-1 armazenado.No init, execute o seguinte comando:
de dentro do diretório git repo, funciona melhor para mim.
Isso puxará todas as mais recentes, incluindo os submódulos.
Explicado
Depois disso, você pode simplesmente executar:
de dentro do diretório git repo, funciona melhor para mim.
Isso puxará todas as mais recentes, incluindo os submódulos.
fonte
Nota: Isso é de 2009 e pode ter sido bom, mas agora existem opções melhores.
Nós usamos isso. É chamado
git-pup
:Basta colocá-lo em um diretório bin adequado (/ usr / local / bin). Se estiver no Windows, pode ser necessário modificar a sintaxe para que funcione :)
Atualizar:
Em resposta ao comentário do autor original sobre puxar todas as HEADs de todos os submódulos - essa é uma boa pergunta.
Tenho certeza de que
git
não tem um comando para isso internamente. Para fazer isso, você precisaria identificar o que realmente é um HEAD para um submódulo. Isso pode ser tão simples quanto dizer quemaster
é o ramo mais atualizado, etc ...Depois disso, crie um script simples que faça o seguinte:
git submodule status
há repositórios "modificados". O primeiro caractere das linhas de saída indica isso. Se um sub-repo for modificado, você NÃO poderá continuar.git checkout master && git pull
. Verifique se há erros.Eu gostaria de mencionar que esse estilo não é realmente o que os sub-módulos git foram projetados. Normalmente, você quer dizer que "LibraryX" está na versão "2.32" e permanecerá assim até que eu diga para "atualizar".
Isso é, de certa forma, o que você está fazendo com o script descrito, mas apenas mais automaticamente. É necessário cuidado!
Atualização 2:
Se você estiver em uma plataforma Windows, pode querer usar o Python para implementar o script, pois ele é muito capaz nessas áreas. Se você estiver no unix / linux, sugiro apenas um script bash.
Precisa de algum esclarecimento? Basta postar um comentário.
fonte
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
e use-o comogit pup
sem nenhum script.git submodule init
após o primeiro pull que incluía submódulos, para que tudo começasse a funcionar corretamente.Henrik está no caminho certo. O comando 'foreach' pode executar qualquer script shell arbitrário. Duas opções para obter as últimas podem ser:
e,
Isso irá percorrer todos os submódulos inicializados e executar os comandos fornecidos.
fonte
O seguinte funcionou para mim no Windows.
fonte
Editar :
Nos comentários foi apontado (por philfreo ) que a versão mais recente é necessária. Se houver algum submódulo aninhado que precise estar em sua versão mais recente:
----- Comentário desatualizado abaixo -----
Essa não é a maneira oficial de fazer isso?
Eu uso sempre. Sem problemas até agora.
Editar:
Acabei de descobrir que você pode usar:
O que também puxará recursivamente todos os submódulos, ou seja, dependências.
fonte
git submodule update --init --recursive
git submodule foreach --recursive git pull
Como pode acontecer que o ramo padrão dos seus submódulos não seja
master
, é assim que automatizo as atualizações completas dos submódulos do Git:fonte
Primeira vez
Sub-módulo Clone e Init
Descansar
Durante o desenvolvimento, basta puxar e atualizar o submódulo
Atualize o submódulo Git para o commit mais recente na origem
A maneira preferida deve estar abaixo
nota: os dois últimos comandos têm o mesmo comportamento
fonte
git submodule update
fiz o truque. Agora estou baixando dados de sub-módulos ausentes no primeiro passo do clone. Obrigado. Eu não sou bom em git: CNão sei desde qual versão do git está funcionando, mas é isso que você está procurando:
Também o uso
git pull
para atualizar o repositório raiz:fonte
As respostas acima são boas, no entanto, estávamos usando o git-hooks para facilitar isso, mas acontece que no git 2.14 , você pode definir
git config submodule.recurse
como true para permitir que os sub-módulos sejam atualizados quando você puxa para o seu repositório git.Isso terá o efeito colateral de empurrar todas as alterações dos submódulos que você tiver, se estiverem em ramificações, mas se você já precisar desse comportamento, isso poderá funcionar.
Pode ser feito usando:
fonte
git submodule init
antes, se o seu submódulo ainda não estiver inicializado.Git para windows 2.6.3 :
git submodule update --rebase --remote
fonte
Do nível superior no repositório:
Isso mudará todos os ramos para desenvolver e puxar as últimas
fonte
git submodule foreach git pull origin master
Tinha que acrescentar o ramo que eu queria buscar. Fora isso, funcionou perfeitamente.Fiz isso adaptando a resposta de gahooa acima :
Integre-o com um git
[alias]
...Se o seu projeto pai tiver algo parecido com isto em
.gitmodules
:Adicione algo assim dentro do seu .gitconfig
Em seguida, para atualizar seus submódulos, execute:
Eu tenho um exemplo disso no meu repositório de configuração do ambiente .
fonte
Tudo que você precisa fazer agora é uma simples
git checkout
Apenas certifique-se de habilitá-lo através desta configuração global:
git config --global submodule.recurse true
fonte
Aqui está a linha de comando para extrair de todos os seus repositórios git, sejam eles ou não submódulos:
Se você executá-lo em seu repositório git superior, poderá substituí-
"$ROOT"
lo.
.fonte
Eu acho que você terá que escrever um script para fazer isso. Para ser sincero, posso instalar o python para fazer isso, para que você possa usá
os.walk
-locd
em cada diretório e emitir os comandos apropriados. O uso de python ou alguma outra linguagem de script, que não seja lote, permitiria adicionar / remover facilmente subprojetos sem a necessidade de modificar o script.fonte
Observação: maneira não muito fácil, mas viável e possui seus próprios profissionais exclusivos.
Se alguém deseja clonar apenas a
HEAD
revisão de um repositório e apenasHEAD
s de todos os seus sub-módulos (por exemplo, checkout "trunk"), então pode-se usar o seguinte script Lua . Às vezes, um comando simplesgit submodule update --init --recursive --remote --no-fetch --depth=1
pode resultar em umgit
erro irrecuperável . Nesse caso, é necessário limpar o subdiretório do.git/modules
diretório e clonar o submódulo manualmente usando ogit clone --separate-git-dir
comando A única complexidade é descobrir URL , caminho do.git
diretório do submódulo e caminho do submódulo na árvore do superprojeto.Observação: o script é testado apenas no
https://github.com/boostorg/boost.git
repositório. Suas peculiaridades: todos os submódulos hospedados no mesmo host e.gitmodules
contém apenas URLs relativos .fonte