Простой способ получить последние из всех подмодулей git - PullRequest
1627 голосов
/ 23 июня 2009

Мы используем подмодули git для управления парой крупных проектов, которые зависят от многих других библиотек, которые мы разработали. Каждая библиотека представляет собой отдельный репозиторий, внесенный в зависимый проект в виде подмодуля. Во время разработки мы часто хотим просто взять последнюю версию каждого зависимого подмодуля.

Есть ли в git встроенная команда для этого? Если нет, то как насчет пакетного файла Windows или аналогичного, который может это сделать?

Ответы [ 19 ]

6 голосов
/ 14 ноября 2009

Посмотрите на http://lists.zerezo.com/git/msg674976.html, который вводит параметр --track

5 голосов
/ 22 мая 2018

Приведенные выше ответы хороши, однако мы использовали git-hooks, чтобы сделать это проще, но получается, что в git 2.14 вы можете установить для git config submodule.recurse значение true включить подмодули для обновления при загрузке в ваш репозиторий git.

Это будет иметь побочный эффект, когда вы будете подталкивать все подмодули, которые у вас есть, если они находятся на ветвях, но если вам уже нужно такое поведение, это может сработать.

Может быть сделано с помощью:

git config submodule.recurse true
4 голосов
/ 07 января 2016

Git для windows 2.6.3 :

git submodule update --rebase --remote

3 голосов
/ 11 января 2016

Я сделал это, адаптировав gahooa ответ выше :

Интеграция с мерзавцем [alias] ...

Если ваш родительский проект имеет что-то подобное в .gitmodules:

[submodule "opt/submodules/solarized"]
    path = opt/submodules/solarized
    url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
    path = opt/submodules/intellij-colors-solarized
    url = git@github.com:jkaving/intellij-colors-solarized.git

Добавьте что-то подобное в ваш .gitconfig

[alias]
    updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "

Затем, чтобы обновить ваши подмодули, запустите:

git updatesubs

У меня есть пример его в моем репозитории установки среды .

2 голосов
/ 01 февраля 2019

С верхнего уровня в репо:

git submodule foreach git checkout develop
git submodule foreach git pull

Это переключит все ветки на разработку и загрузку последних

2 голосов
/ 22 ноября 2018

Все, что вам нужно сделать сейчас, это просто git checkout

Просто убедитесь, что он включен через эту глобальную конфигурацию: git config --global submodule.recurse true

2 голосов
/ 23 сентября 2015

Вот командная строка для извлечения из всех ваших репозиториев git, независимо от того, являются ли они подмодулями:

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

Если вы запускаете его в своем верхнем git-репозитории, вы можете заменить "$ROOT" на ..

1 голос
/ 21 ноября 2015

Замечание: не слишком простой способ, но работоспособный, и у него есть свои уникальные плюсы.

Если нужно клонировать только HEAD ревизию репозитория и только HEAD s из всех его подмодулей(то есть, чтобы оформить «ствол»), тогда можно использовать следующий Lua скрипт.Иногда простая команда git submodule update --init --recursive --remote --no-fetch --depth=1 может привести к неисправимой ошибке git.В этом случае необходимо очистить подкаталог каталога .git/modules и клонировать подмодуль вручную, используя команду git clone --separate-git-dir.Единственная сложность состоит в том, чтобы выяснить URL , путь к каталогу .git подмодуля и путь к подмодулю в дереве суперпроекта.

Примечание: скрипт проверяется только на https://github.com/boostorg/boost.git репозитории.Его особенности: все подмодули, размещенные на одном хосте и .gitmodules, содержат только относительные URL с.

-- 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 голос
/ 23 июня 2009

Я думаю, вам придется написать скрипт для этого. Если честно, я мог бы установить python для этого, чтобы вы могли использовать os.walk до cd для каждого каталога и выполнять соответствующие команды. Использование python или другого языка сценариев, кроме batch, позволит вам легко добавлять / удалять подпроекты без необходимости изменять сценарий.

...