Nós'estamos usando submódulos git para gerenciar um par de grandes projetos que têm dependências em muitas outras bibliotecas que nós'desenvolvemos. Cada biblioteca é um repositório separado trazido para o projeto dependente como um submódulo. Durante o desenvolvimento, nós frequentemente queremos apenas pegar a última versão de cada submódulo dependente.
O git tem um comando construído para fazer isto? Se não, que tal um arquivo de lote do Windows ou similar que possa fazer isso?
Se for's **a primeira vez*** que você fizer o checkout de um repo que você precisa usar --init
primeiro:
git submodule update --init --recursive
Para **git 1.8.2*** ou acima a opção --remote
foi adicionada para suportar a atualização para as últimas dicas de filiais remotas:
git submodule update --recursive --remote
Isto tem o benefício adicional de respeitar qualquer "non default" ramos especificados nos arquivos .gitmodules' ou
.git/config' (se você tiver algum, o padrão é origem/master, neste caso algumas das outras respostas aqui também funcionariam).
Para **git 1.7.3*** ou superior você pode usar (mas os abaixo tem que saber qual atualização ainda se aplica):
git submodule update --recursive
ou..:
git pull --recurse-submodules
se você quiser puxar seus submódulos para as últimas informações sobre o que o repo aponta.
Veja git-submodule(1) para detalhes
Note: Isto é de 2009 e pode ter sido bom então, mas há melhores opções agora.
Nós usamos isto. It's chamado git-pup
:
#!/bin/bash
# Exists to fully update the git repo that you are sitting in...
git pull && git submodule init && git submodule update && git submodule status
Basta colocá-lo em um diretório de lixo adequado (/usr/local/bin). Se no Windows, você pode precisar modificar a sintaxe para que funcione :)
Actualização:
Em resposta ao comentário do autor original sobre puxar todas as CABEÇAS de todos os submódulos - essa é uma boa pergunta.
Tenho quase a certeza de que a git
não tem um comando para isto internamente. Para fazer isso, você precisaria identificar o que o HEAD realmente é para um submódulo. Isso poderia ser tão simples quanto dizer que o master
é o ramo mais atualizado, etc...
A seguir, crie um script simples que faça o seguinte:
git status do submódulo
para "modified" repositórios. O primeiro caractere das linhas de saída indica isto. Se um submódulo for modificado, você pode NÃO querer prosseguir.git checkout master && git pull
. Verifique se há erros.I'gostaria de mencionar que este estilo não é realmente o que os submódulos de git foram projetados para. Tipicamente, você quer dizer "LibraryX" está na versão "2.32" e vai continuar assim até eu dizer para "upgrade".
Isto é, de certa forma, o que você está fazendo com o roteiro descrito, mas apenas mais automaticamente. É preciso ter cuidado!
Actualização 2:
Se você estiver em uma plataforma Windows, você pode querer olhar para o uso do Python para implementar o script, pois ele é muito capaz nessas áreas. Se você está em unix/linux, então eu sugiro apenas um script bash.
Precisa de algum esclarecimento? É só colocar um comentário.
Eu acho que você'terá que escrever um script para fazer isso. Para ser honesto, eu posso instalar o python para fazê-lo de modo que você possa usar os.walk
para cd
em cada diretório e emitir os comandos apropriados. Usar python ou alguma outra linguagem de script, que não seja batch, permitiria adicionar/remover facilmente sub-projetos sem ter que modificar o script.