Łatwy sposób na pobranie najnowszych podmodułów git

Używamy podmodułów git do zarządzania kilkoma dużymi projektami, które mają zależności od wielu innych bibliotek, które stworzyliśmy. Każda Biblioteka jest oddzielnym repo wprowadzonym do zależnego projektu jako submodule. Podczas tworzenia często chcemy po prostu pobrać najnowszą wersję każdego zależnego podmodułu.

Czy git ma wbudowane polecenie, aby to zrobić? Jeśli nie, co powiesz na plik wsadowy systemu Windows lub podobny, który może to zrobić?

Author: Paul Floyd, 2009-06-23

19 answers

Jeśli jest to pierwszy raz sprawdzasz repo, musisz najpierw użyć --init:

git submodule update --init --recursive

Dla git 1.8.2 lub nowszego, opcja --remote została dodana do obsługi aktualizacji do najnowszych porad zdalnych gałęzi:

git submodule update --recursive --remote

Ta dodatkowa zaleta polega na respektowaniu wszelkich gałęzi" non default " określonych w plikach .gitmodules lub .git/config (Jeśli masz jakieś, domyślnie jest to origin / master, w którym to przypadku niektóre z innych odpowiedzi tutaj będą działać, jak również).

Dla git 1.7.3 lub powyżej możesz użyć (ale poniżej omówiono, jaka aktualizacja nadal obowiązuje):

git submodule update --recursive

Lub:

git pull --recurse-submodules

Jeśli chcesz ściągnąć swoje podmoduły do najnowszych zmian zamiast bieżącego commita, do którego wskazuje repo.

Zobacz git-submodule (1) Po szczegóły

 2685
Author: Henrik Gustafsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-11 05:48:39
git pull --recurse-submodules --jobs=10

Cecha, której git nauczył się po raz pierwszy w 1.8.5.

Dopóki błąd nie zostanie naprawiony, po raz pierwszy musisz uruchomić

Git submodule update --INIT --recursive

 658
Author: Alexander Bartosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-22 10:15:25

Na init uruchamiamy następujące polecenie:

git submodule update --init --recursive

Z katalogu Git repo, działa najlepiej dla mnie.

Spowoduje to pobranie wszystkich najnowszych, w tym podmodułów.

Wyjaśnione

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.

Po tym można po prostu uruchomić:

git submodule update --recursive

Z katalogu Git repo, działa najlepiej dla mnie.

Spowoduje to pobranie wszystkich najnowszych, w tym podmodułów.

 397
Author: abc123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-12 17:59:04

UWAGA: To jest z 2009 roku i może wtedy było dobre, ale teraz są lepsze opcje.

Używamy tego. Nazywa się 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

Wystarczy umieścić go w odpowiednim katalogu bin (/usr/local / bin). Jeśli w systemie Windows, być może będziesz musiał zmodyfikować składnię, aby zacząć działać:)

Update:

W odpowiedzi na komentarz oryginalnego autora o ciągnięciu wszystkich głów wszystkich podmodułów-to dobre pytanie.

Jestem prawie pewien to git nie ma komendy dla tego wewnętrznie. Aby to zrobić, musisz określić, jaka głowica jest naprawdę dla podmodułu. To może być tak proste, jak powiedzenie master jest najbardziej aktualną gałęzią itp...

Następnie Utwórz prosty skrypt, który wykonuje następujące czynności:

  1. sprawdź git submodule status dla "zmodyfikowanych" repozytoriów. Wskazuje to pierwszy znak linii wyjściowych. Jeśli sub-repo zostanie zmodyfikowany, możesz nie chcieć kontynuować.
  2. dla każdego repo listed, cd to it ' s directory and run git checkout master && git pull. Sprawdź, czy nie ma błędów.
  3. na koniec, sugeruję wydrukować Wyświetlacz dla użytkownika, aby wskazać aktualny stan podmodułów -- może skłonić go do dodania wszystkich i zatwierdzenia?

Chciałbym wspomnieć, że ten styl nie jest tak naprawdę tym, do czego zostały zaprojektowane podmoduły git. Zazwyczaj chcesz powiedzieć, że "LibraryX" jest w wersji "2.32" i pozostanie w ten sposób, dopóki nie powiem mu "upgrade".

To jest w pewnym sensie to, co robisz z opisanym skryptem, ale po prostu bardziej automatycznie. Wymagana jest opieka!

Aktualizacja 2:

Jeśli jesteś na platformie windows, możesz chcieć przyjrzeć się użyciu Pythona do implementacji skryptu, ponieważ jest on bardzo zdolny w tych obszarach. Jeśli jesteś na unix/linux, to proponuję tylko skrypt bash.

Potrzebujesz wyjaśnień? Wystarczy dodać komentarz.
 307
Author: gahooa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 19:37:07

Henrik jest na dobrej drodze. Polecenie 'foreach' może wykonać dowolny dowolny skrypt powłoki. Dwie opcje, aby wyciągnąć najnowsze może być,

git submodule foreach git pull origin master

I,

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

, który będzie powtarzał się przez wszystkie zainicjalizowane podmoduły i uruchamiał podane polecenia.

 169
Author: mturquette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 14:21:24

Poniższe zadziałało dla mnie na Windows.

git submodule init
git submodule update
 144
Author: zachleat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 13:12:12

Edit :

W komentarzach zaznaczono (przez philfreo), że wymagana jest najnowsza wersja. Jeśli istnieją zagnieżdżone podmoduły, które muszą być w ich najnowszej wersji:

git submodule foreach --recursive git pull

-----Nieaktualny komentarz poniżej-----

Czy to nie jest oficjalny sposób ?
git submodule update --init
Używam go za każdym razem. Na razie żadnych problemów.

Edit:

Właśnie odkryłem, że możesz użyć:

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

Który również rekurencyjnie wyciągnie wszystkie podmodułów, czyli zależności.

 36
Author: antitoxic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 11:21:58

Ponieważ może się zdarzyć, że domyślną gałęzią Twoich podmoduł jest NIE master, w ten sposób automatyzuję pełne uaktualnienia Podmodułów Git:

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'
 35
Author: Sebastien Varrette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 08:58:12

Pierwszy raz

Klon i podmoduł Init

git clone [email protected]:speedovation/kiwi-resources.git resources
git submodule init

Reszta

Podczas rozwoju wystarczy pobrać i zaktualizować podmoduł

git pull --recurse-submodules  && git submodule update --recursive

Update Git submodule to latest commit on origin

git submodule foreach git pull origin master

Preferowany sposób powinien być poniżej

git submodule update --remote --merge

Uwaga: dwa ostatnie polecenia zachowują się tak samo

 35
Author: Yash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-12 19:21:52

Nie wiem od jakiej wersji git to działa, ale tego właśnie szukasz:

git submodule update --recursive

Używam go z git pull również do aktualizacji repozytorium root:

git pull && git submodule update --recursive
 20
Author: Jens Kohl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-30 14:10:08

Powyższe odpowiedzi są dobre, jednak używaliśmy git-hooków, aby to ułatwić, ale okazuje się, że w git 2.14, możesz ustawić git config submodule.recurse to true, aby włączyć moduły podrzędne do aktualizacji Po pobraniu do repozytorium git.

Będzie to miało efekt uboczny popychania wszystkich zmian podmodułów, które masz, jeśli są one jednak na gałęziach, ale jeśli potrzebujesz takiego zachowania, to może to wykonać zadanie.

Można wykonać za pomocą:

git config submodule.recurse true
 11
Author: JamesD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-13 17:11:20

Git dla windows 2.6.3:

git submodule update --rebase --remote

 6
Author: seoul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 16:33:55

Z najwyższego poziomu w repo:

git submodule foreach git checkout develop
git submodule foreach git pull

To przełączy wszystkie gałęzie, aby rozwijały i pobierały najnowsze

 4
Author: Srayan Guhathakurta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-07 09:43:18

zrobiłem to adaptując gahooa ' S odpowiedź powyżej:

Zintegruj go z git [alias] ...

Jeśli twój projekt rodzica ma coś takiego w .gitmodules:

[submodule "opt/submodules/solarized"]
    path = opt/submodules/solarized
    url = [email protected]:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
    path = opt/submodules/intellij-colors-solarized
    url = [email protected]:jkaving/intellij-colors-solarized.git

Dodaj coś takiego w swoim .gitconfig

[alias]
    updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "
Następnie, aby zaktualizować swoje podmoduły, Uruchom:
git updatesubs

Mam przykład tego w moim konfiguracji środowiska repo .

 3
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:39

Wszystko, co musisz teraz zrobić, to proste git checkout

Po prostu upewnij się, aby włączyć go za pomocą tego globalnego config: git config --global submodule.recurse true

 3
Author: Pellet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-22 01:09:31

Oto wiersz poleceń do pobrania ze wszystkich repozytoriów Gita, niezależnie od tego, czy są one podmodułami, czy nie:

ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
find "$ROOT" -name .git -type d -execdir git pull -v ';'

Jeśli uruchomisz go w swoim topowym repozytorium git, możesz zamienić "$ROOT" na ..

 2
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 14:07:23

Często używam tych poleceń, to działa do tej pory.

git pull
git submodule foreach --recursive git checkout master
git submodule foreach --recursive git pull
Oby szybciej.
 2
Author: Binh Ho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-13 02:22:54

Myślę, że będziesz musiał napisać scenariusz, żeby to zrobić. Szczerze mówiąc, Mogę zainstalować Pythona, aby to zrobić, abyś mógł użyć os.walk do cd do każdego katalogu i wydać odpowiednie polecenia. Używanie Pythona lub innego języka skryptowego, innego niż batch, pozwoli Ci łatwo dodawać/usuwać podprojekty bez konieczności modyfikowania skryptu.

 1
Author: baudtack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 04:04:13

Uwaga: nie jest to zbyt łatwy sposób, ale wykonalny i ma swoje unikalne zalety.

Jeśli chcemy sklonować tylko HEAD rewizję repozytorium i tylko HEAD S wszystkich podmodułów its (tj. do kasy" trunk"), możemy użyć następującego skryptu Lua. Czasami proste polecenie git submodule update --init --recursive --remote --no-fetch --depth=1 może spowodować nieodwracalny błąd git. W tym przypadku należy wyczyścić podkatalog katalogu .git/modules i klonować podmoduł ręcznie za pomocą polecenia git clone --separate-git-dir. Jedyną złożonością jest to, aby dowiedzieć się URL , ścieżka .git katalogu podmodułu i ścieżka podmodułu w drzewie superproject.

Uwaga: skrypt jest testowany tylko z repozytorium https://github.com/boostorg/boost.git. Jego osobliwości: wszystkie podmoduły hostowane na tym samym Hostie i .gitmodules zawiera tylko względne URL s.

-- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git .
local module_url = arg[1] or 'https://github.com/boostorg/boost.git'
local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git')
local branch = arg[3] or 'master'
function execute(command)
    print('# ' .. command)
    return os.execute(command)
end
-- execute('rm -rf ' .. module)
if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then
    io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n')
    return 1
end
-- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1
execute('mkdir -p ' .. module .. '/.git/modules')
assert(io.input(module .. '/.gitmodules'))
local lines = {}
for line in io.lines() do
    table.insert(lines, line)
end
local submodule
local path
local submodule_url
for _, line in ipairs(lines) do
    local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$')
    if submodule_ then
        submodule = submodule_
        path = nil
        submodule_url = nil
    else
        local path_ = line:match('^%s*path = (.+)$')
        if path_ then
            path = path_
        else
            submodule_url = line:match('^%s*url = (.+)$')
        end
        if submodule and path and submodule_url then
            -- execute('rm -rf ' .. path)
            local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$')
            -- execute('rm -rf ' .. git_dir)
            execute('mkdir -p $(dirname "' .. git_dir .. '")')
            if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then
                io.stderr:write('can\'t clone submodule ' .. submodule .. '\n')
                return 1
            end
            path = nil
            submodule_url = nil
        end
    end
end
 1
Author: Tomilov Anatoliy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-21 19:49:43