Maneira fácil de puxar o último de todos os submódulos do git

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?

Solução

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

Comentários (20)

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:

  1. verificar 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.
  2. para cada repo listado, coloque um cd no diretório's e execute git checkout master && git pull. Verifique se há erros.
  3. No final, eu sugiro que você imprima um display para o usuário para indicar o status atual dos submódulos -- talvez pedir para que eles adicionem tudo e façam commit?

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.

Comentários (6)

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.

Comentários (0)