Vraag Gemakkelijke manier om de nieuwste van alle git-submodules op te halen


We gebruiken git-submodules om een ​​aantal grote projecten te beheren die afhankelijk zijn van vele andere bibliotheken die we hebben ontwikkeld. Elke bibliotheek is een afzonderlijke repo die als een submodule in het afhankelijke project wordt gebracht. Tijdens de ontwikkeling willen we vaak gewoon de nieuwste versie van elke afhankelijke submodule pakken.

Heeft git een ingebouwd commando om dit te doen? Zo niet, wat dacht je van een Windows-batchbestand of iets dergelijks dat het kan doen?


1372
2018-06-23 01:05


oorsprong


antwoorden:


Voor git 1.8.2 of boven de optie --remote is toegevoegd om bijwerken naar de nieuwste tips van externe branches te ondersteunen:

git submodule update --recursive --remote

Dit heeft het extra voordeel van het respecteren van alle "niet-standaard" branches gespecificeerd in de .gitmodules of .git/config bestanden (als je die toevallig hebt, is default de oorsprong / master, in welk geval sommige van de andere antwoorden hier ook zouden werken).

Voor git 1.7.3 of hoger kun je gebruiken (maar de onderstaande gotchas rond welke update nog steeds van toepassing is):

git submodule update --recursive

of:

git pull --recurse-submodules

als je je submodules naar de laatste commits wilt trekken in plaats van waar de repo naar verwijst.

Opmerking: als dat zo is de eerste keer je checkt een repo af die je moet gebruiken --init eerste:

git submodule update --init --recursive

Voor ouder, git 1.6.1 of hoger kun je iets soortgelijks gebruiken (aangepast om aan te passen):

git submodule foreach git pull origin master

Zien git-submodule (1) voor details


1748
2018-06-23 13:42



Als je spullen voor submodules in je submodule-repositories moet gebruiken

git pull --recurse-submodules

een functie die voor het eerst is geleerd in 1.7.3.

Maar dit zal geen goede commits (die waar je masterrepository naar verwijst) in de submodules checken

Om de juiste commits in uw submodules af te handelen, moet u ze bijwerken nadat u hebt getrokken met

git submodule update --recursive --remote

567
2017-11-10 18:07



Opmerking: dit komt uit 2009 en is misschien goed geweest, maar er zijn nu betere opties.

We gebruiken dit. Het heet 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

Plaats het gewoon in een geschikte bin directory (/ usr / local / bin). Als u in Windows de syntaxis moet wijzigen om het te laten werken :)

Bijwerken:

In reactie op de opmerking van de oorspronkelijke auteur over het intrekken van alle HEADS van alle submodules - dat is een goede vraag.

Ik ben er vrij zeker van dat git heeft hier intern geen opdracht voor. Om dit te doen, zou je moeten identificeren wat HEAD echt is voor een submodule. Dat zou zo simpel kunnen zijn als zeggen master is de meest up-to-date tak, enz ...

Hierna maakt u een eenvoudig script dat het volgende doet:

  1. controleren git submodule status voor "gewijzigde" opslagplaatsen. Het eerste teken van de uitvoerregels geeft dit aan. Als een subrepo wordt gewijzigd, wilt u misschien NIET verdergaan.
  2. voor elke vermelde repo, cd in zijn map en uit te voeren git checkout master && git pull. Controleer op fouten.
  3. Aan het einde, stel ik voor dat je een display naar de gebruiker print om de huidige status van de submodules aan te geven - misschien vragen ze om alles toe te voegen en te committen?

Ik wil graag vermelden dat deze stijl niet echt is waar git-submodules voor zijn ontworpen. Meestal wilt u zeggen dat "BibliotheekX" de versie "2.32" heeft en blijft zo totdat ik het "upgrade" vertel.

Dat is, in zekere zin, wat je doet met het beschreven script, maar gewoon meer automatisch. Zorgvuldigheid is vereist!

Update 2:

Als u zich op een Windows-platform bevindt, wilt u mogelijk Python gebruiken om het script te implementeren, omdat het zeer capabel is in deze gebieden. Als je op unix / linux speelt, dan stel ik alleen een bash-script voor.

Verduidelijkingen nodig? Plaats gewoon een reactie.


295
2018-06-23 01:50



Start bij het uitvoeren van de volgende opdracht:

git submodule update --init --recursive

vanuit de git repo-directory, werkt het best voor mij.

Hiermee worden alle nieuwste gegevens opgehaald, inclusief submodules.

uitgelegd

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

Hierna kunt u gewoon uitvoeren:

git submodule update --recursive

vanuit de git repo-directory, werkt het best voor mij.

Hiermee worden alle nieuwste gegevens opgehaald, inclusief submodules.

uitgelegd

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

289
2017-12-11 19:38



Henrik is op de goede weg. Met de opdracht 'foreach' kan elk willekeurig shellscript worden uitgevoerd. Twee opties om het nieuwste te trekken, zijn misschien:

git submodule foreach git pull origin master

en,

git submodule foreach /path/to/some/cool/script.sh

Dat zal alles doortrekken begonnen submodules en voer de gegeven opdrachten uit.


151
2018-06-23 14:21



Het volgende werkte voor mij op Windows.

git submodule init
git submodule update

138
2017-07-22 13:12



Bewerk:

In de opmerkingen werd gewezen (door philfreo ) dat de nieuwste versie vereist is. Als er geneste submodules zijn die in de nieuwste versie moeten staan:

git submodule foreach --recursive git pull

----- Verouderde opmerking hieronder -----

Is dit niet de officiële manier om het te doen?

git submodule update --init

Ik gebruik het elke keer. Tot nu toe geen problemen.

Bewerk:

Ik heb net ontdekt dat je kunt gebruiken:

git submodule foreach --recursive git submodule update --init 

Die ook recursief alle submodules zal trekken, d.w.z. afhankelijkheden.


33
2018-04-05 16:23



Als het kan gebeurt dat de standaardtak van uw submodules is niet  master, dit is hoe ik de volledige Git submodules-upgrades automatiseer:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

30
2017-12-04 08:58