1141 Stimmen

Git-Submodul auf die letzte Übergabe auf Origin aktualisieren

Ich habe ein Projekt mit einem Git-Submodul. Es ist von einer ssh://... URL und befindet sich auf Commit A. Commit B wurde zu dieser URL gepusht, und ich möchte, dass das Submodul den Commit abruft und zu ihm wechselt.

Ich gehe davon aus, dass git submodule update sollte dies tun, tut es aber nicht. Es tut sich nichts (keine Ausgabe, kein Erfolgs-Exit-Code). Hier ist ein Beispiel:

$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://user@host/git/mod mod
Cloning into mod...
user@host's password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 mod
# At this point, ssh://user@host/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://user@host/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule 
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...

Ich habe auch versucht git fetch mod , das scheinbar einen Fetch durchführt (was aber nicht möglich ist, da es nicht nach einem Passwort fragt), aber git log y git show die Existenz neuer Commits leugnen. Bis jetzt habe ich nur rm -Modul zu entfernen und neu hinzuzufügen, aber das ist sowohl im Prinzip falsch als auch in der Praxis mühsam.

4voto

noseratio Punkte 58099

In meinem Fall wollte ich git auf den neuesten Stand zu bringen und gleichzeitig alle fehlenden Dateien neu zu ergänzen.

Im Folgenden werden die fehlenden Dateien wiederhergestellt (Dank an --force was hier nicht erwähnt worden zu sein scheint), aber es hat keine neuen Commits gezogen:

git submodule update --init --recursive --force

Das tat es:

git submodule update --recursive --remote --merge --force

4voto

NickUnuchek Punkte 9966

Wenn Sie den Wirtszweig nicht kennen, machen Sie dies:

git submodule foreach git pull origin $(git rev-parse --abbrev-ref HEAD)

Es holt sich einen Zweig des Haupt-Git-Repositorys und macht dann für jedes Untermodul einen Pull aus demselben Zweig.

4voto

Mohsin Mahmood Punkte 2476

Wenn Sie zur Kasse gehen möchten master Zweig für jedes Submodul - Sie können dazu den folgenden Befehl verwenden:

git submodule foreach git checkout master

3voto

Friedrich Punkte 1601

Für mich sind alle git submodule hat no arbeiten. Aber das hat funktioniert:

cd <path/to/submodule>
git pull

Es lädt die Drittanbieter-Repo herunter und aktualisiert sie damit. Dann

cd <path/to/repo>
git commit -m "update latest version" <relative_path/to/submodule>
git push

die Ihr entferntes Repository aktualisiert (mit dem Link zur letzten Übertragung repo@xxxxxx ).

2voto

dustinrwh Punkte 850

Hier ist ein genialer Einzeiler, um alles auf den neuesten Stand zu bringen:

git submodule foreach 'git fetch origin --tags; git checkout master; git pull' && git pull && git submodule update --init --recursive

Dank an Mark Jaquith

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