Wie ändere ich das Remote-Repository für ein Git-Submodul?

723

Ich habe ein Git-Repository mit einem Submodul erstellt. Ich kann das Submodul selbst anweisen, seinen Remote-Repository-Pfad zu ändern, bin mir jedoch nicht sicher, wie ich dem übergeordneten Repository mitteilen soll, wie der Remote-Repository-Pfad für das Submodul geändert werden soll.

Ich wäre nicht überrascht, wenn ich etwas Pech hätte und die Dinge manuell erledigen müsste, da selbst das Löschen von Submodulen nicht einfach ist.

Andrew Grimm
quelle
8
Hinweis: Git 2.25 (Q1 2020) enthält einen neuen Befehl ":git submodule set-url [--] <path> <newurl>
VonC

Antworten:

1010

Sie sollten nur in der Lage sein, die .gitmodulesDatei zu bearbeiten , um die URL zu aktualisieren, und dann auszuführen git submodule sync, um diese Änderung am Superprojekt und Ihrer Arbeitskopie widerzuspiegeln.

Jim Puls
quelle
22
Dies scheint .git / config nicht zu aktualisieren, zumindest in 1.7.1 oder 1.7.3.
Davidtbernal
6
Aktualisiert dies auch die URL-Konfiguration des Submoduls für die vorherigen Commits? Wenn ich ein älteres Commit auschecke, zeigt es dann auf neue Submodul-URLs?
Maxmelbin
63
Verwenden Sie git submodule foreach -q git config remote.origin.url, um "aktuelle" Submodul-URLs anzuzeigen
Joel Purra
10
Es wurde .git/configfür mich nicht mit Git 2.1.0 aktualisiert . Ich musste beide .gitmodulesund .git/configmanuell aktualisieren, bevor git submodule sync --recursiveich a ausführen konnte, damit mein Submodul remote aktualisiert wurde.
Desseim
7
Dies scheint zu fehlen, dessen Schlüsselschritt git submodule update --init --recursive --remotetatsächlich das Repository auf die neue Fernbedienung ändert
Jason Axelson
154

Mit diesen Befehlen wird die Eingabeaufforderung bearbeitet, ohne dass Dateien im lokalen Repository geändert werden

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

Im Blog finden Sie Screenshots: Ändern der URL / des Zweigs der GIT-Submodule in eine andere URL / einen anderen Zweig desselben Repositorys

Pavan Sokke Nagaraj
quelle
8
Dies funktionierte, aber ich musste daran denken, die Änderungen auf die Fernbedienung zu übertragen. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00
5
Nun, das hat ein schreckliches Durcheinander für mich verursacht. Die Befehle gingen leise aus, aber das eigentliche Submodul-Repository glaubt immer noch, dass seine Fernbedienung die alte (die alte URL) ist. Vielleicht sollten diese Befehle mit anderen Befehlen im Repository des Submoduls begleitet werden?
Motti Shneor
5
Der letzte Befehl ist etwas extrem ... Wenn Sie Submodule mit Submodulen enthalten, werden dadurch auch die Submodule remote aktualisiert, was unwahrscheinlich ist, was Sie benötigen.
Baptiste Wicht
7
Beachten Sie, dass Sie Submod durch den Namen Ihres Submoduls ersetzen müssen!
Shital Shah
133

In einfachen Worten, Sie müssen nur die .gitmodules-Datei bearbeiten, dann erneut synchronisieren und aktualisieren:

Bearbeiten Sie die Datei entweder über einen git-Befehl oder direkt:

git config --file=.gitmodules -e

oder nur:

vim .gitmodules

dann erneut synchronisieren und aktualisieren:

git submodule sync
git submodule update --init --recursive --remote
Matthew Wilcoxson
quelle
6
git submodule update --inithat für mich gearbeitet, --remotescheint es an den KOPF des Remote Repo zu binden.
Chaim Eliyah
96

Mit Git 2.25 (Q1 2020) können Sie es ändern .
Siehe " Git-Submodul-URL geändert " und den neuen Befehl

git submodule set-url [--] <path> <newurl>

Ursprüngliche Antwort (Mai 2009, vor zehn Jahren)

Tatsächlich wurde im April 2009 ein Patch eingereicht , um die gitmoduleRolle zu klären .

Die Gitmodule-Dokumentation enthält jetzt noch nicht:

Die .gitmodulesDatei, die sich im obersten Verzeichnis eines Git-Arbeitsbaums befindet, ist eine Textdatei mit einer Syntax, die den Anforderungen von linkgit: git-config 1 entspricht .
[NEU]:
Da diese Datei von Git verwaltet wird, werden die + Datensätze der Submodule eines Projekts verfolgt.
In dieser Datei gespeicherte Informationen werden als Hinweis verwendet, um die autorisierende Version des in der Projektkonfigurationsdatei gespeicherten Datensatzes zu aktivieren.
Benutzerspezifische Datensatzänderungen (z. B. um Unterschiede in den Submodul-URLs aufgrund von Netzwerksituationen zu berücksichtigen) sollten an der Konfigurationsdatei vorgenommen werden, während zu propagierende Datensatzänderungen (z. B. + aufgrund einer Verlagerung der Submodulquelle) an dieser Datei vorgenommen werden sollten .

Das bestätigt Jims Antwort ziemlich genau .


Wenn Sie diesem Tutorial zum Git-Submodul folgen , benötigen Sie ein " git submodule init", um die Submodul-Repository-URLs zu .git / config hinzuzufügen.

" git submodule sync" wurde im August 2008 hinzugefügt , um diese Aufgabe zu vereinfachen, wenn sich die URL ändert (insbesondere wenn die Anzahl der Submodule wichtig ist).
Das mit diesem Befehl verknüpfte Skript ist einfach genug:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

Das Ziel bleibt: git config remote."$remote".url "$url"

VonC
quelle
Ich wollte die URL des Submoduls nur auf diesem Computer ändern. Aus dem übergeordneten Projekt konnte ich den Datensatz ändern, .git/configindem ich Folgendes tat: git config submodule."$submodule_name".url "$new_url" was auch hier beschrieben wird .
Joeytwiddle
Was bewirken die optionalen Doppelstriche git submodule set-url [--] <path> <newurl>?
Jeverling
1
@jeverling Sie helfen dabei, Optionen von Parametern zu trennen: siehe stackoverflow.com/a/1192194/6309
VonC
1
Beachten Sie, dass für Ubuntu - Anwender mit einer älteren Version git Sie dieses PPA aktualisieren können: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs
69

Was hat bei mir funktioniert (unter Windows mit der Git-Version 1.8.3.msysgit.0):

  • Aktualisieren Sie .gitmodules mit dem Pfad zum neuen Repository
  • Entfernen Sie die entsprechende Zeile aus der Datei ".git / config"
  • Löschen Sie das entsprechende Verzeichnis im Verzeichnis ".git / modules / external"
  • Löschen Sie das ausgecheckte Submodulverzeichnis selbst (unsicher, ob dies erforderlich ist).
  • Führen Sie git submodule initundgit submodule update
  • Stellen Sie sicher, dass das ausgecheckte Submodul das richtige Commit hat, und schreiben Sie das fest, da es wahrscheinlich ist, dass der Hash anders ist

Nach all dem ist alles in dem Zustand, den ich erwarten würde. Ich kann mir vorstellen, dass andere Benutzer des Repositorys ähnliche Probleme haben werden, wenn sie zum Aktualisieren kommen - es wäre ratsam, diese Schritte in Ihrer Commit-Nachricht zu erläutern!

Ben Hymers
quelle
2
Vielen Dank dafür. Dies ist die einzige, die für mich funktioniert hat, nachdem ich bereits eine ausgeführt hatte git submodule update. Das Befolgen der anderen Antworten würde nichts daran ändern, was sich im ./git/modules/externalVerzeichnis befindet. Wenn Sie also versuchen, ein Update durchzuführen, wird immer noch die falsche URL abgerufen.
NtscCobalt
Dies scheint ein bisschen gefährlich zu sein, und ich bin nicht sicher, ob es die Geschichte des vorherigen Submoduls bewahrt. Wenn Sie zum Beispiel ein altes Commit oder einen alten Zweig Ihres Haupt-Repositorys (das das Submodul enthält) auschecken möchten, bin ich mir nicht sicher, ob es wissen wird, ob das ALTE Submodul angehängt ist, das mit dem alten Commit des Hauptmoduls verbunden ist .
Motti Shneor
Nein, es wird mit ziemlicher Sicherheit nicht wissen - Sie müssen alle Schritte nach dem ersten erneut ausführen. Dies ist genau das, was ich gefunden habe, um den aktuellen Status des Submoduls zu verbessern. Ich weiß nicht, ob sich der Zustand der Dinge geändert hat, seit ich das geschrieben habe :)
Ben Hymers
@MottiShneor, das scheint in der Tat gefährlich zu sein, wenn Sie den vorherigen Submodulverlauf beibehalten müssen, obwohl ich mir nicht sicher bin. In meinem Fall ist es die einzige Lösung, die funktioniert hat. Ich wollte im Grunde das ursprüngliche Submodul durch meine eigene Gabel ersetzen
arainone
1
Befolgen Sie diese Schritte und stellen Sie fest, dass das "Löschen des ausgecheckten Submodulverzeichnisses selbst (unsicher, ob dies erforderlich ist)" erforderlich ist. Andernfalls wird beim Ausführen des Git-Submodul-Updates
PiersyP
10

Bearbeiten Sie einfach Ihre .git / config- Datei. Zum Beispiel; Wenn Sie ein "gemeinsames" Submodul haben, können Sie dies im Supermodul tun:

git config submodule.common.url /data/my_local_common
FelipeC
quelle
Dies ist nur der beste Weg, wenn Sie versuchen, die URL für eine einmalige Verwendung zu ändern, nicht dauerhaft im Superprojekt. Sie möchten beispielsweise Submodule von lokalen Kopien auf der Festplatte klonen.
Andy
4

git config --file=.gitmodules -e öffnet den Standardeditor, in dem Sie den Pfad aktualisieren können

LuGo
quelle