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 Repogit@github.com:userA/TestFramework.git
  • Ich möchte, dass es jetzt darauf hinweist git@github.com: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 git@github.com:userB/TestFramework.git

Ich erhalte diesen Fehler:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com: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.

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:


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 git@github.com:userB/TestFramework.git

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


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 git@github.com: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

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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.