Wie ersetze ich ein Git-Submodul durch ein anderes Repo?

94

Wie ersetze ich ein Git-Submodul durch ein anderes Git-Repo?

Insbesondere habe ich ein Submodul:

  • befindet sich an ./ExternalFrameworks/TestFrameworkdiesem Punkt zu einem Git Repo[email protected]:userA/TestFramework.git
  • Ich möchte, dass es jetzt darauf hinweist [email protected]:userB/TestFramework.git.

Das Problem ist, dass wenn ich das Submodul mit der hier beschriebenen Methode lösche , es dann mit dem Befehl erneut hinzufüge

git submodule add [email protected]:userB/TestFramework.git

Ich erhalte diesen Fehler:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
joseph.hainline
quelle
1
Mögliches Duplikat von Ändern des Remote-Repositorys für ein Git-Submodul
Jiyinyiyong

Antworten:

120

Wenn sich der Speicherort (URL) des Submoduls geändert hat, können Sie einfach:

  1. Ändern Sie Ihre .gitmoduleDatei, um die neue URL zu verwenden
  2. Löschen Sie den Submodul-Ordner im Repo rm -rf .git/modules/<submodule>
  3. Löschen Sie den Submodulordner im Arbeitsverzeichnis rm -rf <submodule>
  4. Lauf git submodule sync
  5. Lauf git submodule update

Weitere Informationen finden Sie an anderer Stelle:

Tim Henigan
quelle
4
Ebenfalls erwähnenswert: Wenn ein anderer Benutzer (der das Submodul bereits aktiviert hat) Ihr Update erhält, muss er auch einmal die "Git-Submodul-Synchronisierung" durchführen, bevor das neue Submodul für ihn funktioniert.
Joseph.Hainline
2
Das hat bei mir nicht funktioniert. Mein Submodul zeigte danach immer noch auf die alte URL. Irgendwelche Ideen warum?
Arne
34
@Arne Vielleicht wurde Ihr Submodul nie richtig initialisiert. Ich musste, rm -rf .git/modules/<submodule>bevor es für mich funktionierte.
David Braun
@DavidBraun Ich habe das gleiche Problem wie @Arne, obwohl es git submodule syncnach rm -rf .git/modules/<submodule>gibt fatal: Not a git repository: ../.git/modules/<submodule>. Irgendwelche Tipps? Ich habe das Submodul zunächst über git submodule add https://<submodule-url>gemäß den Git-Dokumenten erstellt ...
acannon828
1
Danach musste ich in das Verzeichnis des Moduls cd, git den gewünschten Zweig auschecken und dann git pull.
Nicolas Raoul
34

Löschen Sie zunächst das aktuelle Submodul mit der hier bereits erwähnten Methode , die ich der Einfachheit halber einbeziehe:

  • Löschen Sie den entsprechenden Abschnitt aus der .gitmodulesDatei
  • Löschen Sie den entsprechenden Abschnitt aus .git/config
  • Ausführen git rm --cached path_to_submodule(kein abschließender Schrägstrich)
  • Übernehmen und löschen Sie die jetzt nicht verfolgten Submoduldateien

Fügen Sie nun das neue Submodul mit dem --nameFlag hinzu. Dies gibt git einen alternativen Namen, auf den Sie .git/configfür das Submodul verweisen können, um einen Konflikt mit dem historisch vorhandenen Submodul zu lösen, das Sie in Ihrem vorherigen Verlauf noch bearbeiten möchten.

Geben Sie also Folgendes ein:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

und Sie werden das Submodul an dem Pfad laden, den Sie erwarten.

joseph.hainline
quelle
2
Während dieser Weg funktioniert, ist er bei weitem nicht so sauber wie Tims Methode.
Joseph.Hainline
4
Das hat bei mir geklappt aber ich musste auch löschen .git/modules/<path_to_submodule>.
Nate
1
Schätzen Sie den Verweis auf --name. Ich war mir der damit verbundenen Probleme nicht bewusst und konnte ein Submodul erst ersetzen, als ich von dieser Option Gebrauch gemacht habe (dank Ihrer Antwort).
aknuds1
Dies war die einzige Methode, die für mich funktioniert hat, aber ich wollte den gleichen Verzeichnisnamen behalten. Es hat den richtigen Pfad ausgecheckt und den Modulnamen zum gewünschten Namen gemacht, aber der Name des Arbeitsverzeichnisses war der neue Reponame. Also, wenn Sie den gleichen Namen wollen, müssen Sie auch das am Ende der URL wie git submodule add --name old-name-to-keep [email protected]:userB/new-repository.git old-name-to-keep
folgt
8

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 Dev
git submodule sync
git submodule update --init --recursive --remote
Pavan Sokke Nagaraj
quelle
5

Was dies für mich behoben hat, war in der Wurzel Ihres Git-Repo (nicht des Submoduls), run

rm -rf .git/modules/yourmodule

Dann sollten Sie in der Lage sein, wie gewohnt hinzuzufügen.

hobberwickey
quelle
3

Der einfachste Weg, den ich gefunden habe, ist folgender:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Die Idee, meine .gitmodulesmanuell zu ändern, gefiel mir nicht . Ich habe auch einen kleinen Blogpost darüber geschrieben.

DerZyklop
quelle
2

Wenn Sie die Remote-URL nur für diesen Klon ändern möchten :

git config submodule."$submodule_name".url "$new_url"

Dies wirkt sich nicht auf die .gitmodulesDatei im übergeordneten Projekt aus, sodass sie nicht an andere Entwickler weitergegeben wird.

Dies wird als „benutzerspezifischen Datensatzänderungen“ beschrieben hier .

Nicht ausführen,git submodule syncda dies wieder auf die Standard-URL zurückgesetzt wird.

joeytwiddle
quelle