Einfach Weg zu ziehen neueste aller git-Submodule
-
06-07-2019 - |
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?
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:
- ü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. - für jedes Repo aufgeführt, CD in es Verzeichniss wechseln und
git checkout master && git pull
. Fehler prüfen. - 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 HEAD
s 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