Benennen Sie ein Git-Submodul um

154

Gibt es eine einfache Möglichkeit, ein Git-Submodul-Verzeichnis umzubenennen (außer den gesamten Vorgang des Löschens und erneuten Hinzufügens mit einem neuen Zielnamen zu durchlaufen) ?

Und wenn wir schon dabei sind, warum kann ich im übergeordneten Verzeichnis einfach nicht Folgendes tun: git mv old-submodule-name new-submodule-name

Lars Tackmann
quelle
6
Sie müssen nicht mehr .gitmodulesmanuell aktualisieren, wenn Sie ein Submodul verschieben. siehe meine Antwort unten
VonC
@ VonCs Antwort wirkte wie ein Zauber für mich
Laconbass
Git-Module sind zu kompliziert. npmzeigt, wie einfach funktioniert. Eines Tages ... vielleicht ... wird jemand ... es umschreiben ... in der Zwischenzeit ...
Rolf
Die Antwort von @ VonC ist bis heute nicht die ganze Geschichte: Sie wird zwar .gitmodules ändern, sondern nur den Pfad und nicht den Modulnamen umbenennen. Sie benötigen eine zusätzliche Bearbeitung von .gitmodules, um dies zu korrigieren, und eine 'git-Submodul-Synchronisierung', um den gesamten Prozess
abzuschließen
@zertyz: Die Eigenschaft [Submodul "name_of_submodule"] ist ein interner Git-Name. Sie können ihn umbenennen, um sich nicht zu verwirren, aber es ist nur eine Bezeichnung.
MKesper

Antworten:

100

Ich fand folgenden Workflow funktionierend:

  • Aktualisieren Sie .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Hinweis: Bei diesem Ansatz werden der Index und die Git-Module in 2018-Versionen von GIT nicht ordnungsgemäß aktualisiert.

Hinweis: Möglicherweise können Sie dies jetzt tun git mv oldpath newpath, wie in der Antwort von VonC ausgeführt . (Stellen Sie sicher, dass Sie die neueste Version von git verwenden.)

Mariusz Nowak
quelle
22
Hinweis für sich selbst: git add newpathVerwenden Sie keinen
abschließenden
10
Mit einem solchen Workflow erstellen Sie nur einen Symlink zu dem Unterverzeichnis, das Sie als Submodul verwenden. Symlink ist nur ein Teil der globalen Submodulfunktionalität. Dies bedeutet, dass beim Klonen des Repos, das die umbenannten Submodule verwendet, möglicherweise der folgende Fehler auftritt : In .gitmodules wurde keine Submodulzuordnung für den Pfad 'your-oldpath' gefunden. Nachdem Sie den alten Pfad (* git rm oldpath ) entfernt haben, sollten Sie dies tun Verwenden Sie das Git-Submodul. Fügen Sie die REPO-URL newpath anstelle von "git add newpath *" hinzu. Wenn Sie fertig sind, zeigt der Git-Status ungefähr Folgendes an: Umbenannt in: oldpath -> newpath
Bertrand
5
Diese Lösung funktioniert bei mir nicht, da bei Verwendung des Befehls git add das Submodul als einfaches Verzeichnis und nicht als Submodul in das Projekt aufgenommen wurde. Versuchen Sie $ mv submodule-oldpath ~ / ein anderer Speicherort $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam
3
Wenn Sie ein Problem mit dem Arbeitsbaum haben, können Sie die .git/modules/SUBMODULE/configDatei auch so bearbeiten , dass sie wieder worktreeauf das richtige Verzeichnis verweist.
Vincent Ketelaars
3
Das hat bei mir mit git nicht geklappt 2.13.1. Aber einfach zu tun git mv old newfunktioniert wie ein Zauber. Ich muss nur Git Commit ausführen, um die Änderungen abzuschließen.
Benutzer
223

Git1.8.5 (Oktober 2013) sollte den Prozess vereinfachen . Mach einfach ein:

git mv A B

" git mv A B", wenn ein Submodul verschoben Awird, wurde gelernt, seinen Arbeitsbaum zu verschieben und die Pfade in der .gitmodulesDatei anzupassen .


Weitere Informationen finden Sie in commit 0656781fadca1 :

Wenn Sie derzeit " git mv" für ein Submodul verwenden, wird der Arbeitsbaum des Submoduls in den des Superprojekts verschoben. Die Pfadeinstellung des Submoduls .gitmodulesbleibt jedoch unberührt, was jetzt nicht mehr mit dem Arbeitsbaum übereinstimmt und Git-Befehle erstellt, die auf den richtigen path -> name mapping(wie statusund) basierendiff Gefällt mir ) seltsam verhalten.

Lassen Sie " git mv" hier helfen, indem Sie nicht nur den Arbeitsbaum des Submoduls verschieben, sondern auch die submodule.<submodule name>.pathEinstellung " " aus der .gitmodulesDatei aktualisieren und beide bereitstellen.
Dies geschieht nicht, wenn keine .gitmodulesDatei gefunden wird, und gibt nur dann eine Warnung aus, wenn kein Abschnitt für dieses Submodul vorhanden ist. Dies liegt daran, dass der Benutzer möglicherweise nur einfache Gitlinks ohne die .gitmodulesDatei verwendet oder die Pfadeinstellung bereits manuell aktualisiert hat, bevor er den Befehl "git mv" ausgibt (in diesem Fall erinnert ihn die Warnung daran, dass mvdies für ihn getan worden wäre).
Nur wenn .gitmodulesgefunden wird und Zusammenführungskonflikte enthält, schlägt der mvBefehl fehl und weist den Benutzer an, den Konflikt zu lösen, bevor er es erneut versucht.


Git 2.9 (Juni 2016) wird sich verbessern git mv für das Submodul :

Siehe Commit a127331 (19. April 2016) von Stefan Beller ( stefanbeller) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 9cb50a3 , 29. April 2016)

mv: Verschieben verschachtelter Submodule zulassen

" git mv old new" hat den Pfad für ein Submodul, das als Unterverzeichnis im Inneren fungiert, nicht angepasstold/ Verzeichnis korrekt angepasst.

Submodule müssen jedoch ihren Link zum Git-Verzeichnis sowie die .gitmodulesDatei aktualisieren .

VonC
quelle
Hinweis für sich selbst: Versuchen Sie dies auf 1.8.4 und Sie werden haben fatal: source directory is empty, source=my_source, destination=my_destination. Ich werde es erneut versuchen, wenn 1.8.5 eine stabile Version hat.
Prüfsumme
@checksum Aber 1.8.5 hat eine stabile Version, für mindestens einige ... Stunden;) github.com/git/git/releases/tag/v1.8.5
VonC
Ich musste Git Version 1.8.5.GIT aus dem Quellcode erstellen, da es Git v.1.7.5 in Ubuntu-Repositories gibt. Wie man Git aus dem Quellcode baut
Maksim Dmitriev
2
@MaksimDmitriev, aber was ist mit einem ppa (Personal Package Archive), das ich in stackoverflow.com/a/20918469/6309 erwähnt habe ?
VonC
1
git mv funktioniert einfach nicht für diesen Zweck auf meinem Computer.
Alexander Dyagilev
11

Ich habe nur ein paar der oben vorgeschlagenen ausprobiert. Ich renne:

$ git --version
git version 1.8.4

Ich fand es am besten, das Submodul zu de-initieren, das Verzeichnis zu entfernen und ein neues Submodul zu erstellen.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Zumindest hat das bei mir am besten funktioniert. YMMV!

jaredwolff
quelle
7

Es ist nicht möglich, es umzubenennen. Sie müssen es also zuerst entfernen ( deinit) und erneut hinzufügen.

Also nach dem Entfernen:

git submodule deinit <path>
git rm --cached <path>

Sie können auch die Verweise darauf überprüfen und entfernen in:

  • .gitmodules
  • .git/config
  • Entfernen Sie den Referenzordner aus .git/modules/<name>(am besten, um ein Backup zu configerstellen ), da jeder Ordner eine Datei enthält, in der der Verweis auf seinen Ordner gespeichert istworktree

Führen Sie dann Ihre Änderungen durch, indem Sie Änderungen an Ihrem Repo vornehmen, indem Sie:

git commit -am 'Removing submodule.'

und überprüfen Sie noch einmal, ob Sie keine offenen Fragen haben, indem Sie:

git submodule update
git submodule sync
git submodule status

Jetzt können Sie das Git-Submodul erneut hinzufügen:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
Kenorb
quelle
auch ist es eigentlich heute
Alexey
Der Titel der Frage ist eine falsche Bezeichnung, er bezieht sich auf den Pfad, nicht auf den Namen
Max Robbertze
3

Bearbeiten Sie die .gitmodules-Datei, um das Submodul umzubenennen, und benennen Sie dann das Submodulverzeichnis um.

Ich denke, Sie müssen möglicherweise eine git submodule syncNachuntersuchung durchführen, aber ich bin derzeit nicht in der Lage, dies zu überprüfen.

Abizern
quelle
Dies führt dazu, dass der neue Submodulname als neues Commit und nicht als Umbenennung auftritt. Aber vielleicht muss es so sein?
Lars Tackmann
1
@Lars: Stellen Sie sicher, dass Sie auch das alte Submodul-Verzeichnis entfernen!
Cascabel
3

MacOs : Wenn ich die VonC-Lösung verwenden möchte , um den Submodulordner Commonin Kleinbuchstaben zu ändern :

git mv Common common

Ich bekomme

fatal: Umbenennen von 'Common' fehlgeschlagen: Ungültiges Argument

Lösung - Verwenden Sie einen temporären Ordnernamen und verschieben Sie ihn zweimal:

git mv Common commontemp
git mv commontemp common

Das ist alles :)

Kamil Kiełczewski
quelle