Frage

Wir verwenden git Submodule zu verwalten, auf ein paar große Projekte, die Abhängigkeiten zu vielen anderen Bibliotheken, die wir entwickelt haben.Jede Bibliothek ist ein separates repo brachte in den abhängigen Projekt als ein Submodul.Während der Entwicklung, wir wollen oft zu gehen, nur greifen die neueste version von jedem abhängig Submodul.

Hat git einen eingebauten Befehl, dies zu tun?Wenn nicht, wie wäre es mit einer Windows batch-Datei oder ähnliches, die es tun können?

War es hilfreich?

Lösung

Wenn es das erste mal Kasse Sie ein repo, die Sie verwenden müssen --init erste:

git submodule update --init --recursive

Für git 1.8.2 oder über die option --remote wurde Hinzugefügt, um Unterstützung zu aktualisieren, um die neuesten Tipps von remote-Niederlassungen:

git submodule update --recursive --remote

Dies hat den zusätzlichen Vorteil, respektieren jeder "nicht-Standard" - Filialen in der angegebenen .gitmodules oder .git/config - Dateien (wenn Sie passieren zu haben jede, standardmäßig wird origin/master, in dem Fall einige der anderen Antworten hier funktionieren würde, wie gut).

Für git-1.7.3 oder über, die Sie verwenden können (aber die unten fallen um das update hat noch immer gelten):

git submodule update --recursive

oder:

git pull --recurse-submodules

wenn Sie wollen zu ziehen Sie Ihre Submodule neuesten verpflichtet intead von dem, was die repo-Punkte zu.

Finden git-Submodul(1) details

Andere Tipps

Wenn Sie Material für Submodule in Ihre Submodul Repositorys ziehen verwenden

git pull --recurse-submodules
  

ein Feature git erste in 1.7.3 gelernt.

Aber das wird Kasse nicht richtig Commits (die, die Ihre Master-Repository Punkte) in Submodule

Um die richtige Commits in Ihrem Submodule Kasse Sie sollten sie aktualisiert werden nach der Verwendung ziehen

git submodule update --recursive --remote

Ein init den folgenden Befehl ausführen:

git submodule update --init --recursive

aus dem Git-Repo-Verzeichnis, funktioniert am besten für mich.

Dies wird alle neuesten einschließlich Submodule ziehen.

Erklärung

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.

Danach können Sie nur ausführen:

git submodule update --recursive

aus dem Git-Repo-Verzeichnis, funktioniert am besten für mich.

Dies wird alle neuesten einschließlich Submodule ziehen.

. Hinweis: Diese aus dem Jahr 2009 ist und dann gut gewesen sein, aber es gibt bessere Optionen jetzt

Wir verwenden diese. Es heißt 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

Einfach gesetzt in einem geeigneten bin-Verzeichnis (/ usr / local / bin). Wenn unter Windows, müssen Sie die Syntax ändern, um es an die Arbeit:)

Update:

Als Reaktion auf den Kommentar von dem ursprünglichen Autor über in allen Köpfen aller Submodule ziehen -. Das ist eine gute Frage

Ich bin ziemlich sicher, dass git keinen Befehl hat intern dafür. Um dies zu tun, müssten Sie erkennen, was wirklich HEAD für ein Submodul ist. Das könnte so einfach sein wie sagen master die aktuellsten Zweig ist, etc ...

Im Anschluss daran erstellen ein einfaches Skript, die den folgenden:

  1. überprüfen git submodule status für "modifizierte" Repositories. Das erste Zeichen der Ausgangsleitungen zeigt dies. Wenn ein Unter Repo geändert wird, können Sie nicht fortfahren möchten.
  2. für jedes Repo aufgeführt, CD in es Verzeichniss wechseln und git checkout master && git pull. Fehler prüfen.
  3. Am Ende, empfehle ich Ihnen eine Anzeige für den Benutzer drucken den aktuellen Status der Submodule, um anzuzeigen, - vielleicht sie auffordern, alle hinzuzufügen und zu verpflichten

Ich möchte erwähnen, dass dieser Stil nicht wirklich, was git Submodule wurden konzipiert. Normalerweise wollen Sie „LibraryX“ sagen, in der Version „2.32“ ist und wird auch so bleiben, bis ich ihm sagen, ein „Upgrade“.

Das heißt, in einem gewissen Sinne, was Sie mit dem beschriebenen Skript tun, sondern nur mehr automatisch. Vorsicht ist geboten!

Update 2:

Wenn Sie auf einer Windows-Plattform sind, können Sie bei Verwendung von Python aussehen wollen das Skript zu implementieren, wie es durchaus in der Lage in diesen Bereichen ist. Wenn Sie auf Unix / Linux sind, dann schlage ich nur ein Bash-Skript.

irgendwelche Erklärungen nötig? schreiben Sie einen Kommentar.

Henrik ist auf dem richtigen Weg. Der ‚foreach‘ Befehl kann jeden beliebigen Shell-Skript ausführen. Zwei Optionen ziehen die allerneueste auch sein mag,

git submodule foreach git pull origin master

und

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

Das wird durch alle iterieren initialisiert Submodule und die gegebenen Befehle ausführen.

In der folgenden für mich unter Windows gearbeitet.

git submodule init
git submodule update

Bearbeiten :

In den Kommentaren wurde darauf hingewiesen (von philfreo ), dass die neueste Version erforderlich ist. Wenn es irgendwelche verschachtelten Submodule, die in ihrer neuesten Version sein müssen:

git submodule foreach --recursive git pull

----- Veraltet Kommentar unten -----

Ist das nicht der offizielle Weg, es zu tun?

git submodule update --init

Ich benutze es jedes Mal. Keine Probleme bisher.

Edit:

Ich fand nur, dass Sie verwenden können:

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

Welche wird auch rekursiv alle der Submodule ziehen, das heißt Abhängigkeiten.

Wie es passiert, dass der Standard-Zweig der Submodule ist nicht master, das ist, wie ich die volle Git Submodule Upgrades automatisieren:

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'

Zum ersten Mal

Clone und Init Submodul

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

Rest

Während der Entwicklung gerade ziehen und Update-Modul

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

Update Git Submodul neuesten Commit auf Herkunft

git submodule foreach git pull origin master

Bevorzugte Art und Weise sollte unter sein

git submodule update --remote --merge

Hinweis: letzte beiden Befehle haben gleiches Verhalten

Ich weiß nicht, seit der Version von git dies funktioniert, aber das ist, was Sie suchen:

git submodule update --recursive

Ich benutze es mit git pull der Root-Repository zu aktualisieren, zu:

git pull && git submodule update --recursive

Lesen Sie http://lists.zerezo.com/git/msg674976.html was bringt einen --track Parameter

Die oben genannten Antworten sind gut, aber wir git-Haken wurden mit dieser einfacher zu machen, aber es stellt sich heraus, dass in git 2,14 können Sie git config submodule.recurse auf true Submodule zu ermöglichen, aktualisiert, wenn Sie zu Ihrem Git Repository zu ziehen.

Dies wird den Nebeneffekt haben alle Submodule des Drückens ändern Sie haben, wenn sie jedoch auf Zweigen sind, aber wenn Sie dieses Verhalten müssen bereits dies könnte den Job.

durch den Einsatz getan werden kann:

git config submodule.recurse true

Git für Fenster 2.6.3 :

git submodule update --rebase --remote

Ich tat dies durch die Anpassung gahooa 's Antwort oben :

Integrieren Sie es mit einem git [alias] ...

Wenn Ihr übergeordnetes Projekt so etwas wie dies in .gitmodules hat:

[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

Fügen Sie so etwas wie dies in Ihrem .gitconfig

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

Dann ist Ihre Submodule zu aktualisieren, führen Sie:

git updatesubs

Ich habe ein Beispiel davon in meine Umgebung Setup Repo rel="nofollow.

Hier ist die Befehlszeile aus allen Git-Repositorys zu ziehen, ob sie oder nicht Submodule:

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

Wenn Sie es in Ihrem Top-Git Repository ausgeführt wird, Sie "$ROOT" in . ersetzen kann.

Alles, was Sie jetzt tun müssen, ist eine einfache git checkout

So stellen Sie sicher, dass es über diese globale Konfiguration aktivieren: git config --global submodule.recurse true

Von der obersten Ebene im Repo:

git submodule foreach git checkout develop
git submodule foreach git pull

Damit werden alle Zweige wechseln zu entwickeln und ziehen neueste

Ich denke, Sie ein Skript schreiben, dies zu tun. Um ehrlich zu sein, könnte ich installieren Python, es zu tun, so dass Sie os.walk verwenden können, um jedes Verzeichnis cd und die entsprechenden Befehle zu erteilen. Mit Python oder eine andere Skriptsprache, andere als Batch, würde ermöglicht es Sie leicht hinzufügen / entfernen Teilprojekte mit aus dem Skript ändern zu müssen.

. Hinweis: nicht zu einfach Art und Weise, aber praktikabel und es hat seine eigenen Vor-

Wenn man möchte nur HEAD Revision eines Endlagers und nur HEADs aller seiner Submodule (das heißt zur Kasse „Stamm“) klonen, dann kann man folgende verwenden Lua Skript. Manchmal einfacher Befehl git submodule update --init --recursive --remote --no-fetch --depth=1 kann in einem nicht wieder git Fehlern. In diesem Fall braucht man, um Unterverzeichnis von .git/modules Verzeichnis aufzuräumen und Klon-Modul mit manuell git clone --separate-git-dir Befehl. Die einzige Komplexität ist es, herauszufinden URL , Pfad von .git Verzeichnis Submodul und dem Pfad der Submodul in Superproject Baum.

Hinweis: das Skript nur gegen https://github.com/boostorg/boost.git Repository getestet wird. Seine Besonderheiten:. Alle Submodule auf dem gleichen Host und .gitmodules gehostet enthält nur relativ 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top