925 Stimmen

Wie kann man das entfernte Repository für ein Git-Submodul ändern?

Ich habe ein Git-Repository mit einem Submodul darin erstellt. Ich kann dem Submodul selbst sagen, dass es seinen Pfad zum entfernten Repository ändern soll, aber ich bin mir nicht sicher, wie ich dem übergeordneten Repository sagen kann, dass es den Pfad zum entfernten Repository für das Submodul ändern soll.

Es würde mich nicht wundern, wenn ich Pech habe und die Dinge manuell erledigen muss, denn selbst das Löschen von Untermodulen ist nicht einfach.

1237voto

Jim Puls Punkte 75380

Sie sollten lediglich die Möglichkeit haben, die .gitmodules Datei, um die URL zu aktualisieren, und führen Sie dann git submodule sync --recursive um diese Änderung im Superprojekt und in Ihrer Arbeitskopie zu berücksichtigen.

Dann müssen Sie auf die Seite .git/modules/path_to_submodule Verzeichnis und ändern Sie seine Konfigurationsdatei, um den Git-Pfad zu aktualisieren.

Wenn die Repo-Historie anders ist, müssen Sie den neuen Zweig manuell auschecken:

git submodule sync --recursive
cd <submodule_dir> 

git fetch
git checkout origin/master
git branch master -f
git checkout master

236voto

VonC Punkte 1117238

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

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

(Auf der -- Trennzeichen, siehe " Doppelter Bindestrich als Signal, die Interpretation der Option zu beenden und alle folgenden Argumente wörtlich zu behandeln ")

Warnung: Hi-Angel Erwähnt in den Kommentaren (auch mit Git 2.31.1 getestet):

Man sollte vorsichtig sein mit git submodule set-url weil es einen Fehler hat:

Wenn Sie in Ihrem .gitmodules Datei sieht der Pfad wie folgt aus some-path und dann führen Sie eine git submodule set-url some-path/ new-url (beachten Sie den abschließenden Schrägstrich / ), dann wird der Befehl anstelle der Änderung des bestehenden Submoduls hinzufügen. eine andere.


Originalantwort (Mai 2009, vor zehn Jahren)

Eigentlich ein Patch wurde im April 2009 eingereicht zu klären gitmodule Rolle.

Jetzt ist also die Gitmodul-Dokumentation noch nicht enthalten:

El .gitmodules Datei, die sich im obersten Verzeichnis eines Git-Arbeitsbaums befindet, ist eine Textdatei mit einer Syntax, die den Anforderungen von -of linkgit:git-config 4 .
[NEU]:
Da diese Datei von Git verwaltet wird, verfolgt sie die +Einträge der Untermodule eines Projekts.
Die in dieser Datei gespeicherten Informationen werden als Hinweis auf die maßgebliche Version des in der Projektkonfigurationsdatei gespeicherten Datensatzes verwendet.
Benutzerspezifische Datensatzänderungen (z. B. zur Berücksichtigung von Unterschieden in den Submodul-URLs aufgrund von Netzwerksituationen) sollten in der Konfigurationsdatei vorgenommen werden, während Datensatzänderungen, die propagiert werden sollen (z. B. aufgrund einer Verlagerung der Submodulquelle), in dieser Datei vorgenommen werden sollten.

Das bestätigt ziemlich genau Jims Antwort .


Wenn Sie dies befolgen Git-Submodul-Anleitung Sie sehen, Sie brauchen einen " git submodule init ", um die URLs der Submodul-Repositorys zu .git/config hinzuzufügen.

" git submodule sync " hat wurde im August 2008 hinzugefügt um diese Aufgabe bei URL-Änderungen zu erleichtern (insbesondere wenn die Anzahl der Untermodule wichtig ist).
Das Skript für die Verknüpfung mit diesem Befehl ist sehr einfach zu handhaben:

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 bestehen: git config remote."$remote".url "$url"

198voto

Diese Befehle erledigen die Arbeit an der Eingabeaufforderung, ohne Dateien im lokalen Repository zu verändern

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

Screenshots sind im Blog zu finden: Ändern der URL/Verzweigung von GIT-Submodulen in eine andere URL/Verzweigung des gleichen Repositorys

158voto

Matthew Wilcoxson Punkte 3154

Einfach ausgedrückt: Sie müssen nur die .gitmodules-Datei bearbeiten, dann neu synchronisieren und aktualisieren:

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

git config --file=.gitmodules -e

oder einfach:

vim .gitmodules

dann erneut synchronisieren und aktualisieren:

git submodule sync
git submodule update --init --recursive --remote

83voto

Ben Hymers Punkte 24077

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

  • Aktualisieren Sie .gitmodules mit der URL zum neuen Repository
  • Entfernen Sie die entsprechende Zeile aus der Datei ".git/config".
  • Löschen Sie das entsprechende Verzeichnis im Verzeichnis ".git/modules/external" (".git/modules" für neuere Git-Versionen)
  • Löschen des ausgecheckten Submodulverzeichnisses selbst (unsicher, ob dies notwendig ist)
  • ausführen. git submodule init y git submodule update
  • Vergewissern Sie sich, dass das ausgecheckte Submodul den richtigen Commit hat, und übertragen Sie diesen, da der Hash wahrscheinlich anders sein wird

Nachdem ich all das getan habe, 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 aktualisieren wollen - es wäre klug, diese Schritte in Ihrer Commit-Nachricht zu erklären!

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