2628 Stimmen

Einfacher Weg, die aktuellsten aller Git-Submodule zu ziehen

Wir verwenden Git-Submodule, um einige große Projekte zu verwalten, die von vielen anderen Bibliotheken, die wir entwickelt haben, abhängig sind. Jede Bibliothek ist ein separates Repo, das als Submodul in das abhängige Projekt eingebracht wird. Während der Entwicklung wollen wir oft einfach die neueste Version jedes abhängigen Submoduls holen.

Verfügt Git über einen eingebauten Befehl, um dies zu tun? Wenn nicht, wie wäre es dann mit einer Windows-Batch-Datei oder ähnlichem, die das erledigen kann?

0 Stimmen

git-deep sollte dabei helfen.

17 Stimmen

@Brad wollen Sie Ihre Kopien von Submodulen auf die im Master-Projekt genannten Commit-Revs aktualisieren oder wollen Sie den letzten HEAD-Commit von jedem Submodul ziehen? Die meisten Antworten hier beziehen sich auf Ersteres; viele Leute wollen Letzteres.

1 Stimmen

Sie können diese Antwort mit Git flow with submodules hilfreich finden stackoverflow.com/a/70910397/9566462

1voto

Tomilov Anatoliy Punkte 14605

Anmerkung: nicht ganz einfach, aber machbar, und es hat seine eigenen Vorteile.

Wenn man nur klonen will HEAD Revision eines Repositorys und nur HEAD s aller seiner Untermodule (d. h. zum Auschecken von "trunk"), dann kann man folgendes verwenden Lua Drehbuch. Manchmal ist ein einfacher Befehl git submodule update --init --recursive --remote --no-fetch --depth=1 kann zu einer nicht wiederherstellbaren git Fehler. In diesem Fall muss man das Unterverzeichnis von .git/modules Verzeichnis und klonen Sie das Submodul manuell mit git clone --separate-git-dir Befehl. Die einzige Schwierigkeit besteht darin, herauszufinden URL , Pfad der .git Verzeichnis des Submoduls und Pfad des Submoduls im Superprojektbaum.

Anmerkung: Das Skript wird nur getestet gegen https://github.com/boostorg/boost.git Endlager. Seine Besonderheiten: alle Untermodule werden auf demselben Host gehostet und .gitmodules enthält nur relative 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

0voto

baudtack Punkte 26516

Ich glaube, dafür müssen Sie ein Skript schreiben. Um ehrlich zu sein, würde ich Python dafür installieren, damit Sie os.walk a cd in jedes Verzeichnis und geben Sie die entsprechenden Befehle ein. Wenn Sie Python oder eine andere Skriptsprache als Batch verwenden, können Sie problemlos Unterprojekte hinzufügen/entfernen, ohne das Skript ändern zu müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X