Wie entferne ich ein Submodul?

Lesezeit: 10 Minuten

Wie entferne ich ein Submodul
R.Martinho Fernandes

Wie entferne ich ein Git-Submodul?

Übrigens, gibt es einen Grund, warum ich es nicht einfach tun kann
git submodule rm whatever ?

  • Die einfache Antwort stackoverflow.com/a/21211232/94687 ist jetzt die richtige und sollte auch so gekennzeichnet werden. Nun, es ist einfach git rm modulename und rm -rf .git/modules/modulename

    – imz – Ivan Zakharyaschev

    15. Juni 2015 um 15:46 Uhr

  • Das stimmt eigentlich nicht. Diese Antwort befasst sich nicht mit dem Entfernen des Submoduleintrags aus .git/config. Die akzeptierte Antwort zeigt die aktuelle Methode zum vollständigen Entfernen eines Submoduls. Es wird auch in dieser Antwort prägnanter erklärt: stackoverflow.com/a/36593218/1562138

    – fvgs

    13. April 2016 um 9:02 Uhr


  • Ich fand diesen Artikel sehr hilfreich beim Entfernen von Submodulen. Es enthält Informationen zum Entfernen von Einträgen in den .gitsubmodules- und .git/config-Dateien Verknüpfung

    – Ri_

    15. Mai 2016 um 17:46 Uhr


  • Bitte sparen Sie sich etwas Zeit und gehen Sie direkt zu der Antwort, die funktioniert (in 2017): stackoverflow.com/a/36593218/528313

    – Vincenzo Pii

    16. Januar 2017 um 12:57 Uhr

  • Ich habe zwei Tage lang mit Submodulproblemen gerungen. Der Durchbruch kam, als ich das fand: forums.developer.apple.com/thread/13102. Grundsätzlich haben Xcode und vielleicht andere Apps Schwierigkeiten, URLs zu erweitern, die „~“ enthalten. Sobald ich ssh://[email protected]/~/git/MyRepo.git in ssh://[email protected]/home/username/git/MyRepo.git geändert habe (sehen Sie den tatsächlichen Pfad nach auf Ihrem Server), alle Verrücktheiten verschwanden innerhalb von zehn Minuten. Siehe auch stackoverflow.com/questions/32833100/…

    – Elise van Looij

    9. Februar 2018 um 12:48 Uhr

1646894891 590 Wie entferne ich ein Submodul
VonC

Seit git1.8.3 (22. April 2013):

Es gab keine Porzellanart zu sagen “Ich interessiere mich nicht mehr für dieses Teilmodul”, wenn Sie Ihr Interesse an einem Teilmodul mit “git submodule init“.
git submodule deinit“ ist der Weg dazu.

Der Löschvorgang verwendet auch git rm (seit git1.8.5 Oktober 2013).

Zusammenfassung

Der dreistufige Entfernungsprozess wäre dann:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Erläuterung

rm -rf: Dies wird in Daniel Schroeders Antwort erwähnt und von Eonil in den Kommentaren zusammengefasst:

Diese Blätter .git/modules/<path-to-submodule>/ unverändert.
Wenn Sie also einmal ein Submodul mit dieser Methode löschen und erneut hinzufügen, ist dies nicht möglich, da das Repository bereits beschädigt ist.


git rm: Sehen Commit 95c16418:

Derzeit mit “git rm” auf einem Submodul entfernt den Arbeitsbaum des Submoduls aus dem des Superprojekts und den Gitlink aus dem Index.
Aber der Abschnitt des Submoduls in .gitmodules bleibt unangetastet, was ein Überbleibsel des nun entfernten Submoduls ist und Nutzer irritieren könnte (im Gegensatz zum Einsetzen .git/configmuss dies als Erinnerung daran bleiben, dass der Benutzer Interesse an diesem Submodul gezeigt hat, damit es später neu gefüllt wird, wenn ein älterer Commit ausgecheckt wird).

Lassen “git rm” Helfen Sie dem Benutzer, indem Sie nicht nur das Submodul aus dem Arbeitsbaum entfernen, sondern auch das “submodule.<submodule name>„Abschnitt aus der .gitmodules sowohl archivieren als auch inszenieren.


git submodule deinit: Es stammt von dieser Patch:

Mit “git submodule init” Der Benutzer kann git mitteilen, dass ihm ein oder mehrere Submodule wichtig sind, und möchte, dass es beim nächsten Aufruf von “git submodule update“.
Aber derzeit gibt es keine einfache Möglichkeit, Git mitzuteilen, dass sie sich nicht mehr um ein Submodul kümmern und den lokalen Arbeitsbaum loswerden möchten (es sei denn, der Benutzer weiß viel über die Interna von Submodulen und entfernt das “submodule.$name.url“Einstellung von .git/config zusammen mit dem Arbeitsbaum selbst).

Helfen Sie diesen Benutzern, indem Sie ein ‘deinit‘ Befehl.
Dies entfernt das Ganze submodule.<name> Abschnitt aus .git/config entweder für das/die angegebene(n) Teilmodul(e) (oder für alle die initialisiert wurden, wenn ‘.“ ist gegeben).
Fehlschlagen, wenn der aktuelle Arbeitsbaum Änderungen enthält, es sei denn, es wird erzwungen.
Beschweren Sie sich, wenn für ein auf der Befehlszeile angegebenes Submodul die URL-Einstellung nicht gefunden werden kann .git/configaber trotzdem nicht scheitern.

Dies sorgt dafür, dass die (De-)Initialisierungsschritte (.git/config und .git/modules/xxx)

Seit git1.8.5 ist die git rm nimmt Auch Betreuung der:

  • add‘-Schritt, der die URL eines Submoduls in der aufzeichnet .gitmodules Datei: Sie muss für Sie entfernt werden.
  • das Submodul Sondereintrag (wie durch diese Frage veranschaulicht): Der git rm entfernt es aus dem Index:
    git rm --cached path_to_submodule (kein abschließender Schrägstrich)
    Dadurch wird das im Index gespeicherte Verzeichnis mit einem speziellen Modus “160000” entfernt und als Submodul-Root-Verzeichnis markiert.

Wenn Sie diesen letzten Schritt vergessen und versuchen, ein Submodul als reguläres Verzeichnis hinzuzufügen, erhalten Sie eine Fehlermeldung wie:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Hinweis: Seit Git 2.17 (Q2 2018) ist das Git-Submodul deinit kein Shell-Skript mehr.
Es ist ein Aufruf einer C-Funktion.

Sehen Commit 2e61273, 1342476 festschreiben (14. Januar 2018) von Prathamesh Chavan (pratham-pc).
(Zusammengeführt von Junio ​​C. Hamano — gitster in ead8dbe übergeben13.02.2018)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "[email protected]"

  • Können Sie ein Beispiel für die Verwendung von geben submodule deinit?

    – Zak-Tänze

    28. April 2013 um 18:42 Uhr

  • @yourfriendzak hier ist ein Beispiel für jemanden, der es erfolgreich verwendet: stackoverflow.com/a/16161950/6309. Aber denken Sie daran, dass 1.8.3 entgegen meiner ursprünglichen Annahme noch nicht veröffentlicht wurde! Unter Unix können Sie es aus den Quellen kompilieren.

    – VonC

    28. April 2013 um 18:45 Uhr

  • @HamishDowner der spezielle Eintrag sollte weg sein (das Verzeichnis ist kein Submodul mehr), und die .gitmodules sollte ok sein, aber ich würde trotzdem alles mit dem überprüfen .git Verzeichnis (also die lokal config, in Ihrem lokalen Repo: Das wird nicht durch a geändert git pull)

    – VonC

    4. Juni 2013 um 15:40 Uhr

  • @Jayen ja, wenn Sie die Entfernung der begehen .gitmodules Eintrag und das Entfernen des speziellen Eintrags im Index, und pushen Sie dieses Repo, andere können es ziehen und dieses Submodul wird weg sein.

    – VonC

    2. August 2013 um 6:04 Uhr


  • Im aktuellen Git (v1.9+), einfach alt git rm submodule macht genau das, was Sie wollen, wie andere Leute bereits gesagt haben.

    – Peter Peterson

    12. Juni 2014 um 17:36 Uhr

  • Warum hat diese Antwort so wenige Upvotes? All diesen populären Antworten fehlt etwas, dies ist die einzige, die wirklich alle Spuren eines Submoduls auf einfachste Weise entfernt. Und beachten Sie: Die Reihenfolge der Befehle ist wichtig.

    – mbdevpl

    7. September 2016 um 6:08 Uhr


  • @mbdevpl kam 3 Jahre nach der akzeptierten Antwort, und ich denke, niemand hat es geschafft, das OP davon zu überzeugen, diese zu akzeptieren

    – Andy

    20. Februar 2017 um 1:58 Uhr

  • DAS ist die unkomplizierte Antwort im Jahr 2018?

    – Warren P

    2. Februar 2018 um 22:43 Uhr

  • der .gitmodules Datei scheint immer noch nicht betroffen zu sein, wenn diese Befehle ausgeführt werden

    – Fraktal

    5. September 2018 um 6:50 Uhr

  • 2019 geht das nicht. Die letzte Zeile versucht tatsächlich, aus dem zu entfernen .git/modules Ordner, den Sie bereits in der obigen Zeile entfernt haben. Hinzufügen -- in der ersten Zeile wie die akzeptierte Antwort scheint dies zu funktionieren.

    – Fmstrat

    28. Juni 2019 um 20:01 Uhr


Wie entferne ich ein Submodul
Thor

Nur eine Notiz. Seit Git 1.8.5.2 reichen zwei Befehle aus:

git rm -r the_submodule
rm -rf .git/modules/the_submodule

Wie in der Antwort von @Mark Cheverton richtig hervorgehoben wurde, verhindert der verbleibende Ordner .git/modules/the_submodule, dass dasselbe Submodul in Zukunft wieder hinzugefügt oder ersetzt wird, wenn die zweite Zeile nicht verwendet wird, selbst wenn Sie das Submodul vorerst entfernt haben . Auch, wie @VonC erwähnt, git rm wird die meiste Arbeit auf einem Submodul erledigen.

–Aktualisierung (05.07.2017)–

Nur um klarzustellen, the_submodule ist der relative Pfad des Submoduls innerhalb des Projekts. Zum Beispiel ist es subdir/my_submodule wenn sich das Submodul in einem Unterverzeichnis befindet subdir.

Wie in den Kommentaren und anderen Antworten richtig darauf hingewiesen wird, hinterlassen die beiden Befehle (obwohl sie funktional zum Entfernen eines Submoduls ausreichen) eine Spur in der [submodule "the_submodule"] Abschnitt von .git/config (Stand Juli 2017), die mit einem dritten Befehl entfernt werden kann:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

  • Ich bin auf Git-Version 2.4.9 (Apple Git-60) und alles, was ich tun musste, war rm the_submodule. Ich habe darauf gedrängt, dass dann ein Ordner mit dem gleichen Namen wie das Submodul erneut hinzugefügt wurde, und es hat ohne Probleme funktioniert.

    – David Silva Smith

    3. Dezember 2015 um 21:23 Uhr

  • Dadurch wird der Submoduleintrag nicht entfernt .git/config. Siehe stackoverflow.com/a/36593218/1562138 für die vollständige Methode zum Entfernen eines Submoduls.

    – fvgs

    13. April 2016 um 8:53 Uhr

  • @drevicko Ich habe das gerade mit Git 2.11.1 getestet und beobachte das gleiche Verhalten wie zuvor. git init && git submodule add <repository> && git rm <name> hinterlässt die .git/config Eintrag und die .git/modules/<name> Verzeichnis und dessen Inhalt. Vielleicht haben Sie das Submodul vor dem Entfernen nicht initialisiert?

    – fvgs

    22. Februar 2017 um 16:58 Uhr

  • Ich fühle mich sicherer, wenn ich dies zuerst ausführe. git submodule deinit -f the_submodule

    – danday74

    10. März 2017 um 4:22 Uhr

  • @JarrodSmith Ja, es ist der Pfad. Bitte sehen Sie sich das Update an.

    – Tor

    6. Juli 2017 um 3:04 Uhr


Einfache Schritte

  1. Konfigurationseinträge entfernen:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Verzeichnis aus Index entfernen:
    git rm --cached $submodulepath
  3. Begehen
  4. Unbenutzte Dateien löschen:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Bitte beachten Sie: $submodulepath enthält keine führenden oder abschließenden Schrägstriche.

Hintergrund

Wenn Sie das tun git submodule addes fügt es nur hinzu .gitmodulesaber einmal hast du es getan git submodule initfügte es hinzu .git/config.

Wenn Sie also die Module entfernen, aber schnell wiederherstellen möchten, dann tun Sie einfach Folgendes:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

Es ist eine gute Idee, dies zu tun git rebase HEAD zuerst und git commit
am Ende, wenn Sie dies in ein Skript einfügen.

Schauen Sie sich auch eine Antwort auf an Kann ich ein Git-Submodul entfernen?.

  • Ich bin auf Git-Version 2.4.9 (Apple Git-60) und alles, was ich tun musste, war rm the_submodule. Ich habe darauf gedrängt, dass dann ein Ordner mit dem gleichen Namen wie das Submodul erneut hinzugefügt wurde, und es hat ohne Probleme funktioniert.

    – David Silva Smith

    3. Dezember 2015 um 21:23 Uhr

  • Dadurch wird der Submoduleintrag nicht entfernt .git/config. Siehe stackoverflow.com/a/36593218/1562138 für die vollständige Methode zum Entfernen eines Submoduls.

    – fvgs

    13. April 2016 um 8:53 Uhr

  • @drevicko Ich habe das gerade mit Git 2.11.1 getestet und beobachte das gleiche Verhalten wie zuvor. git init && git submodule add <repository> && git rm <name> hinterlässt die .git/config Eintrag und die .git/modules/<name> Verzeichnis und dessen Inhalt. Vielleicht haben Sie das Submodul vor dem Entfernen nicht initialisiert?

    – fvgs

    22. Februar 2017 um 16:58 Uhr

  • Ich fühle mich sicherer, wenn ich dies zuerst ausführe. git submodule deinit -f the_submodule

    – danday74

    10. März 2017 um 4:22 Uhr

  • @JarrodSmith Ja, es ist der Pfad. Bitte sehen Sie sich das Update an.

    – Tor

    6. Juli 2017 um 3:04 Uhr


1646894892 378 Wie entferne ich ein Submodul
GAMITG

Neben den Empfehlungen musste ich auch rm -Rf .git/modules/path/to/submodule um ein neues Submodul mit demselben Namen hinzufügen zu können (in meinem Fall habe ich eine Gabel durch das Original ersetzt)

  • Damit hatte ich auch Probleme. Wenn Sie versuchen, ein Submodul im selben Pfad neu zu installieren, werden die Zweiginformationen an der von Ihnen erwähnten Stelle zwischengespeichert, was die Dinge durcheinander bringt.

    – Jangosteve

    5. März 2012 um 22:27 Uhr

  • Danke, das habe ich auch gebraucht. @Anton, ich stimme zu und habe die Antwort mit der höchsten Bewertung bearbeitet, um diese Informationen hinzuzufügen.

    – William Dennis

    23. September 2012 um 15:17 Uhr

  • Ich habe die Option –name verwendet, damit das Ersetzen funktioniert … siehe stackoverflow.com/questions/14404704/…

    – joseph.hainline

    18. Januar 2013 um 18:06 Uhr

986710cookie-checkWie entferne ich ein Submodul?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy