Ł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ć?
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
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
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.
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:
- 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ć. - dla każdego repo listed, cd to it ' s directory and run
git checkout master && git pull
. Sprawdź, czy nie ma błędów. - 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.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.
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
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.
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'
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
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
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
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
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
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 .
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
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 .
.
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.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.
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
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