Wie entferne ich ein Submodul?

3539

Wie entferne ich ein Git-Submodul?

Gibt es übrigens einen Grund, den ich nicht einfach tun kann git submodule rm whatever?

R. Martinho Fernandes
quelle
109
Die einfache Antwort stackoverflow.com/a/21211232/94687 ist jetzt die richtige und sollte so markiert werden. Jetzt ist es einfach git rm modulenameundrm -rf .git/modules/modulename
imz - Ivan Zakharyaschev
10
Das stimmt eigentlich nicht. Diese Antwort bezieht sich nicht auf das Entfernen des Submoduleintrags aus .git/config. Die akzeptierte Antwort zeigt die aktuelle Möglichkeit, ein Submodul vollständig zu entfernen. Es wird auch prägnanter in dieser Antwort erklärt: stackoverflow.com/a/36593218/1562138
fvgs
Ich fand diesen Artikel sehr hilfreich beim Entfernen von Submodulen. Es enthält Informationen zum Entfernen von Einträgen im Link
Ri_
12
Bitte sparen Sie sich etwas Zeit und gehen Sie direkt zu der Antwort, die funktioniert (in 2017): stackoverflow.com/a/36593218/528313
Vincenzo Pii
Ich habe zwei Tage lang mit Submodulproblemen gerungen. Der Durchbruch kam, als ich Folgendes fand: forums.developer.apple.com/thread/13102 . Grundsätzlich haben Xcode und möglicherweise andere Apps Schwierigkeiten, URLs mit '~' zu erweitern. Sobald ich ssh: //[email protected]/~/git/MyRepo.git in ssh: //[email protected]/home/username/git/MyRepo.git geändert habe (siehe den tatsächlichen Pfad) auf Ihrem Server) verschwand die ganze Verrücktheit innerhalb von zehn Minuten. Siehe auch stackoverflow.com/questions/32833100/…
Elise van Looij

Antworten:

2213

Seit git1.8.3 (22. April 2013) :

Es gab keine Möglichkeit, mit Porzellan zu sagen "Ich interessiere mich nicht mehr für dieses Submodul", wenn Sie Ihr Interesse an einem Submodul mit " submodule init" zum Ausdruck gebracht haben .
" submodule deinit" ist der Weg dazu.

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

Zusammenfassung

Der 3-stufige 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: Die in Rede ist Daniel Schroeder ‚s Antwort , und durch zusammengefasst Eonil in den Kommentaren :

Dies bleibt .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: Siehe Commit 95c16418 :

git rmWenn Sie derzeit " " für ein Submodul verwenden, werden der Arbeitsbaum des Submoduls aus dem des Superprojekts und der Gitlink aus dem Index entfernt.
Der Abschnitt des Submoduls in .gitmodulesbleibt jedoch unberührt. Dies ist ein Überbleibsel des jetzt entfernten Submoduls und kann Benutzer irritieren (im Gegensatz zum Einstellen .git/configmuss dies als Erinnerung bleiben, dass der Benutzer Interesse an diesem Submodul gezeigt hat, damit es später wieder aufgefüllt wird wenn ein älteres Commit ausgecheckt ist).

Lassen Sie " git rm" dem Benutzer helfen, indem Sie nicht nur das Submodul aus dem Arbeitsbaum entfernen, sondern auch den submodule.<submodule name>Abschnitt " " aus der .gitmodulesDatei entfernen und beides bereitstellen.


git submodule deinit: Es stammt aus diesem Patch :

Mit " git submodule init" kann der Benutzer git mitteilen, dass er sich für ein oder mehrere Submodule interessiert, und möchte, dass es beim nächsten Aufruf von " git submodule update" aufgefüllt wird.
Derzeit gibt es jedoch keine einfache Möglichkeit, Git zu sagen, dass sie sich nicht mehr für ein Submodul interessieren und den lokalen Arbeitsbaum entfernen möchten (es sei denn, der Benutzer weiß viel über Interna des Submoduls und entfernt die submodule.$name.urlEinstellung " " .git/configzusammen mit der Arbeit Baum selbst).

Helfen Sie diesen Benutzern, indem Sie einen deinitBefehl ' ' eingeben.
Dies entfernt den gesamten submodule.<name>Abschnitt .git/configentweder für die angegebenen Submodule ( oder für alle, die initialisiert wurden, wenn ' .' angegeben ist).
Fehler, wenn der aktuelle Arbeitsbaum Änderungen enthält, sofern dies nicht erzwungen wird.
Beschweren Sie sich, wenn für ein in der Befehlszeile angegebenes Submodul die URL-Einstellung nicht gefunden werden kann .git/config, aber dennoch nicht fehlschlägt.

Dies ist wichtig, wenn die (De-) Initialisierungsschritte ( .git/configund .git/modules/xxx)

Seit git1.8.5 git rmkümmert sich das auch um:

  • ' add' Schritt, der die URL eines Submoduls in der .gitmodulesDatei aufzeichnet : Es muss für Sie entfernt werden.
  • Der spezielle Submoduleintrag (wie in dieser Frage dargestellt ): Der Git rm entfernt ihn 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-Stammverzeichnis markiert .

Wenn Sie diesen letzten Schritt vergessen und versuchen, ein Submodul als reguläres Verzeichnis hinzuzufügen, wird folgende Fehlermeldung angezeigt:

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.

Siehe Commit 2e61273 , Commit 1342476 (14. Januar 2018) von Prathamesh Chavan ( pratham-pc) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit ead8dbe , 13. Februar 2018)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"
VonC
quelle
18
Können Sie ein Anwendungsbeispiel für angeben submodule deinit?
Zakdances
5
@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 Überzeugung noch nicht veröffentlicht wurde! Unter Unix können Sie es aus den Quellen kompilieren.
VonC
2
@HamishDowner Der spezielle Eintrag sollte weg sein (das Verzeichnis ist kein Submodul mehr) und das .gitmodulessollte in Ordnung sein, aber ich würde immer noch alles mit dem .gitVerzeichnis überprüfen (dh die lokale Konfiguration in Ihrem lokalen Repo: das ist nicht geändert durch a git pull)
VonC
2
@Jayen Ja, wenn Sie das Entfernen des .gitmodulesEintrags und das Entfernen des speziellen Eintrags im Index festschreiben und dieses Repo drücken, können andere es ziehen und das Submodul wird verschwunden sein.
VonC
3
Im aktuellen Git (v1.9 +) macht plain old git rm submodulegenau das, was Sie wollen, wie andere bereits gesagt haben.
Pete Peterson
3445

Über die Seite Git Submodule Tutorial :

Um ein Submodul zu entfernen, müssen Sie:

  1. Löschen Sie den entsprechenden Abschnitt aus der .gitmodulesDatei.
  2. Stellen Sie die .gitmodulesÄnderungen in Szene:
    git add .gitmodules
  3. Löschen Sie den entsprechenden Abschnitt aus .git/config.
  4. Entfernen Sie die Submodul-Dateien aus dem Arbeitsbaum und dem Index:
    git rm --cached path_to_submodule(kein abschließender Schrägstrich).
  5. Entfernen Sie das .gitVerzeichnis des Submoduls :
    rm -rf .git/modules/path_to_submodule
  6. Übernehmen Sie die Änderungen:
    git commit -m "Removed submodule <name>"
  7. Löschen Sie die jetzt nicht verfolgten Submodul-Dateien:
    rm -rf path_to_submodule

Siehe auch : alternative Schritte unten .

John Douthat
quelle
410
"Und übrigens, gibt es einen Grund, warum ich nicht einfach das Submodul rm was auch immer geben kann?" ?
Abernier
48
@abernier Eine knappe Antwort könnte lauten: "Weil kein solcher Befehl existiert." Ich vermute, dass sie versuchen, das Entfernen von Submodul-Dateien im Vergleich zur Submodul-Konfiguration explizit zu machen, um versehentlichen Datenverlust zu vermeiden. Vielleicht würde eine Person denken, dass dies git submodule rmeinfach die Registrierung von Submodulen entfernt, und wäre überrascht, wenn der Befehl auch das lokale Repository löschen würde. Alle lokalen Änderungen würden unwiederbringlich verloren gehen. Und vielleicht würde eine andere Person denken, dass nur die Dateien entfernt würden.
John Douthat
119
Ehrlich gesagt weiß ich nicht warum. Ich hoffe jedoch, dass sie einen Befehl hinzufügen. Diese 4 Schritte sind zu kompliziert.
John Douthat
25
Hier ist ein Bash-Skript, das ein Submodul entfernt. Erstellen Sie einfach einen Git-Alias ​​für submodule-rm;) gist.github.com/2491147
Capi Etheriel
33
Benötigen Sie auch den Namen rm -rf .git \ modules \ submodule?
Rogerdpack
484

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

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

Wie die Antwort von @Mark Cheverton richtig gezeigt hat, 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 . Wie @VonC bereits erwähnt, erledigt er den git rmgrößten Teil der Arbeit auf einem Submodul.

--Update (07/05/2017) -

Zur Verdeutlichung the_submoduleist der relative Pfad des Submoduls innerhalb des Projekts. Zum Beispiel, subdir/my_submodulewenn sich das Submodul in einem Unterverzeichnis befindet subdir.

Wie in den Kommentaren und anderen Antworten richtig ausgeführt , hinterlassen die beiden Befehle (obwohl sie funktional ausreichen, um ein Submodul zu entfernen) im [submodule "the_submodule"]Abschnitt von .git/config(Stand Juli 2017) eine Spur , die mit einem dritten Befehl entfernt werden kann:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
Tinlyx
quelle
5
Ich bin auf Git Version 2.4.9 (Apple Git-60) und alles was ich tun musste war rm the_submodule. Ich drückte darauf und fügte dann einen Ordner mit dem gleichen Namen wie das Submodul hinzu, und es funktionierte ohne Probleme.
David Silva Smith
19
Dadurch wird der Submoduleintrag nicht entfernt .git/config. Unter stackoverflow.com/a/36593218/1562138 finden Sie die vollständige Methode zum Entfernen eines Submoduls.
fvgs
2
@drevicko Ich habe dies 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 den .git/configEintrag und das .git/modules/<name>Verzeichnis und seinen Inhalt. Vielleicht haben Sie das Submodul vor dem Entfernen nicht initialisiert?
Fvgs
2
Ich fühle mich sicherer, wenn ich dieses erste Mal laufe. Git-Submodul deinit -f the_submodule
danday74
1
@ JarrodSmith Ja, es ist der Weg. Bitte beachten Sie das Update.
Tinlyx
478

Die meisten Antworten auf diese Frage sind veraltet, unvollständig oder unnötig komplex.

Ein mit git 1.7.8 oder neuer geklontes Submodul hinterlässt höchstens vier Spuren von sich selbst in Ihrem lokalen Repo. Der Vorgang zum Entfernen dieser vier Spuren wird durch die folgenden drei Befehle angegeben:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
fvgs
quelle
39
Warum hat diese Antwort so wenige positive Stimmen? All diese populären Antworten vermissen 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
2
Um auf meine eigene Frage zu antworten: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
Thomas
5
@mbdevpl kam 3 Jahre nach der akzeptierten Antwort, und ich denke, niemand hat es geschafft, das OP davon zu überzeugen, diese zu akzeptieren
Andy
10
DAS ist die nicht komplizierte Antwort im Jahr 2018?
Warren P
9
Die .gitmodules- Datei scheint immer noch nicht betroffen zu sein,
wenn
206

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 dem Index entfernen:
    git rm --cached $submodulepath
  3. Verpflichten
  4. Nicht verwendete Dateien löschen:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Bitte beachten Sie: $submodulepath Enthält keine führenden oder nachfolgenden Schrägstriche.

Hintergrund

Wenn Sie dies tun git submodule add, wird es nur hinzugefügt .gitmodules, aber sobald Sie dies getan haben git submodule init, wird es hinzugefügt.git/config .

Wenn Sie also die Module entfernen möchten, diese aber schnell wiederherstellen können, gehen Sie wie folgt vor:

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

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

Schauen Sie sich auch eine Antwort auf Kann ich ein Git-Submodul entvölkern? .

Fehlerentwickler
quelle
1
Ich hatte viele Submodule (und ein größeres Durcheinander), also musste ich sie durch eine for-Schleife führen. Da die meisten von ihnen sich unter einem bestimmten Verzeichnis befanden und die Ausgabe von ls nachgestellte Schrägstriche enthielt. Ich habe so etwas gemacht for dir in directory/*; do git rm --cached $dir; done.
Pablo Olmos de Aguilera C.
Um dies zu erreichen, sieht die Liste, die im Skript zum rekursiven Löschen verwendet werden kann - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'- - so aus, als müssten Sie dies wirklich tun, falls etwas durcheinander ist, andernfalls nurgit submodule | grep -v '^+' | cut -d' ' -f3
Fehlerentwickler
2
um die Liste der Module zu erhalten, in denen keine lokalen Änderungen vorgenommen wurden -git submodule | grep '^+' | cut -d' ' -f2
errordeveloper
Beachten Sie, ich musste submodulenamein doppelte Anführungszeichen setzen "submodulename".. unter Bezugnahme auf die .git/configDatei
Myon
Einfach. Effizient. In 2.25.0 müssen Sie nach Schritt 1 Änderungen an .gitmodules vor Schritt 2 durchführen.
Michel Donais
83

Zusätzlich zu den Empfehlungen musste ich rm -Rf .git/modules/path/to/submodulein der Lage sein, ein neues Submodul mit demselben Namen hinzuzufügen (in meinem Fall ersetzte ich eine Gabel durch das Original).

Mark Cheverton
quelle
1
Ich hatte auch Probleme damit. Wenn Sie versuchen, ein Submodul auf demselben Pfad neu zu installieren, werden die Zweigstelleninformationen an dem von Ihnen genannten Speicherort zwischengespeichert, was die Dinge durcheinander bringt.
Jangosteve
Danke, das brauchte ich auch. @Anton, ich stimme zu und ich habe die bestbewertete Antwort bearbeitet, um diese Informationen hinzuzufügen.
William Denniss
Ich habe die Option --name verwendet, damit das Ersetzen funktioniert ... siehe stackoverflow.com/questions/14404704/…
joseph.hainline
60

So entfernen Sie ein hinzugefügtes Submodul mit:

git submodule add [email protected]:repos/blah.git lib/blah

Lauf:

git rm lib/blah

Das ist es.

Für alte Versionen von git (ca. 1.8.5) verwenden Sie:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
Doug
quelle
1
+1 in der Tat. Dies ist die einzig richtige Antwort ab Git 1.8.3. Sollte als die richtige akzeptiert werden.
Xananax
6
git rmlässt immer noch Sachen drin .git/modules/. (2.5.4)
Rudolf Adamkovič
1
@ RudolfAdamkovic funktioniert es bei mir? Beachten Sie, dass der Submoduleintrag nur entfernt wird, wenn der genaue Pfad übereinstimmt. Wenn Sie ein Submodul verschoben und dann verwendet git rmhaben, ist dies nicht der Fall. Ein schneller Test mit 2.5.4 auf meinem Mac aktualisiert die .gitmodules-Datei, wie in der Dokumentation hier beschrieben: git-scm.com/docs/git-rm#_submodules ... aber wenn Sie eine Plattformkombination gefunden haben / Version, in der dies nicht passiert, sollten Sie wahrscheinlich einen Fehler melden.
Doug
2
Diese Antwort ist nicht ganz richtig. Lässt git rmSachen in Verzeichnis .git/modules/und .git/configDatei (Ubuntu, Git 2.7.4). Andere Antwort funktioniert 100%: stackoverflow.com/a/36593218/4973698
mbdevpl
50

Sie müssen den Eintrag in .gitmodulesund .git/configentfernen und das Verzeichnis des Moduls aus dem Verlauf entfernen:

git rm --cached path/to/submodule

Wenn Sie auf die Mailingliste von git schreiben, wird wahrscheinlich jemand ein Shell-Skript für Sie erstellen.

Carmine Paolino
quelle
Es ist kein Shell-Skript erforderlich, andere Antworten enthalten Befehle zum Entfernen aller Spuren eines Submoduls: stackoverflow.com/a/36593218/4973698
mbdevpl
42

Sie können einen Alias ​​verwenden, um die von anderen bereitgestellten Lösungen zu automatisieren:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Fügen Sie das in Ihre Git-Konfiguration ein, und dann können Sie Folgendes tun: git rms path/to/submodule

Charles
quelle
-1, da dies einfach zu falsch ist. ERSTE: Dies setzt voraus, dass der Name und der Pfad des Submoduls identisch sind, was meistens nicht der Fall ist . IE git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two. ZWEITENS: Sie müssen dies vom richtigen Pfad aus ausführen. gitAliase sollten an einer beliebigen Stelle im Arbeitsbaum funktionieren (oder ordnungsgemäß fehlschlagen). DRITTES: git config -f .git/configschlägt innerhalb von Submodulen fehl, da .gitnormalerweise eine Datei vorhanden ist.
Tino
42

Zusammenfassend sollten Sie Folgendes tun:

  1. Setze path_to_submodulevar (kein abschließender Schrägstrich):

    path_to_submodule=path/to/submodule

  2. Löschen Sie die entsprechende Zeile aus der .gitmodules-Datei:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. Löschen Sie den entsprechenden Abschnitt aus .git / config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Heben Sie die Bühne auf und entfernen Sie $ path_to_submodule nur aus dem Index (um den Verlust von Informationen zu vermeiden).

    git rm --cached $path_to_submodule

  5. Verfolgen Sie Änderungen an .gitmodules

    git add .gitmodules

  6. Übernehmen Sie das Superprojekt

    git commit -m "Remove submodule submodule_name"

  7. Löschen Sie die jetzt nicht verfolgten Submodul-Dateien

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

luissquall
quelle
Also müssen alle anderen, die meine Änderung abrufen, rm -rf $ path_to_submodule rm -rf .git / modules / $ path_to_submodule ausführen, um den Submodul-Cache zu entfernen?
j2emanue
Ich empfehle zu aktualisieren , git submodule update. Und wenn die Submodulpfade nicht korrekt aktualisiert wurden (Git gibt einen Fehler aus), entfernen Sie sie:rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
luissquall
40

Wenn das Submodul versehentlich hinzugefügt wurde, weil Sie einen Ordner hinzugefügt, festgeschrieben und verschoben haben, der bereits ein Git-Repository (enthalten .git) war, müssen Sie keine .gitmodulesDatei bearbeiten oder irgendetwas darin .git/config. In diesem Fall brauchen Sie nur:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW , ich habe auch den .gitOrdner entfernt, bevor ich das gemacht habe git add.

Oli Studholme
quelle
genau mein Fall
Zhekaus
37

Ich fand deinitWerke gut für mich:

git submodule deinit <submodule-name>    
git rm <submodule-name>

Aus Git-Dokumenten :

deinit

Heben Sie die Registrierung der angegebenen Submodule auf, dh entfernen Sie den gesamten submodule.$name Abschnitt zusammen mit ihrem Arbeitsbaum aus .git / config.

Damjan Pavlica
quelle
Stimmen Sie zu, die gleiche Lösung zu finden. Es ist ein bester Weg heute im Jahr 2018)
woto
1
.git / modules / ... wurde nicht entfernt. Sie sollten sie entfernen, siehe die Antwort von @fvgs
Vilém Kurz
Ich weiß nicht, warum diese einfache Lösung nicht die Nummer 1 ist
Marc Magon
AFAICS dies scheint die zu sein , die meisten sicherste Antwort für neuer gits , die von wissen deinit, wie die anderen Antwort , die entfernt .git/modules/submodulezu früh Verzeichnis, das neuere zu machen scheint gits jetzt scheitern oder dann. Auch (siehe meinen Kommentar dort) ist das Entfernen .git/modules/submodulemöglicherweise der falsche Pfad. Dies ist also ein gefährlicher Schritt, der am besten erst später ausgeführt wird, gitwenn Sie sich beschweren (oder wenn Sie zu 299% sicher sind, dass dies der richtige Pfad ist und wirklich benötigt wird).
Tino
Ich musste auch git commitinszenierte Änderungen im Arbeitsverzeichnis vornehmen: modified .gitmodulesund deleted <submodule-path>.
Yuriy Pozniak
20

Nachdem ich mit all den verschiedenen Antworten auf dieser Site experimentiert hatte, kam ich zu folgender Lösung:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

Dadurch wird der exakt gleiche Status wie vor dem Hinzufügen des Submoduls wiederhergestellt. Sie können das Submodul sofort wieder hinzufügen, was bei den meisten Antworten hier nicht möglich war.

git submodule add $giturl test
aboveScript test

Dadurch haben Sie eine saubere Kaufabwicklung, ohne dass Änderungen vorgenommen werden müssen.

Dies wurde getestet mit:

$ git --version
git version 1.9.3 (Apple Git-50)
Udondan
quelle
Warum benutzt du git rm --cached $pathdann rm -rf $pathstatt git rm -r $path?
Bfontaine
-1 Funktioniert nicht, wenn Sie versuchen, ein Submodul innerhalb eines Submoduls zu entfernen (Submodul kann Bäume bilden!). Auch dies ist wegen fehlender Zitate gefährlich fehlerhaft! Beispiel git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'-> Wenn Sie versuchen, 'gefährliches .. Submodul' mit Ihrem Skript zu entfernen, ist dies rm -rf ..wahrscheinlich nicht das, was Sie wollen ..
Tino
17

Was ich gerade im Dezember 2012 mache (kombiniert die meisten dieser Antworten):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
Lance Rushing
quelle
15

Folgendes habe ich getan:

1.) Löschen Sie den entsprechenden Abschnitt aus der .gitmodules-Datei. Sie können den folgenden Befehl verwenden:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Führen Sie die .gitmodulesÄnderungen durch

git add .gitmodules

3.) Löschen Sie den entsprechenden Abschnitt aus .git/config. Sie können den folgenden Befehl verwenden:

git submodule deinit -f "submodule_name"

4.) Entfernen Sie den Gitlink (kein abschließender Schrägstrich):

git rm --cached path_to_submodule

5.) Bereinigen Sie die .git/modules:

rm -rf .git/modules/path_to_submodule

6.) Festschreiben:

git commit -m "Removed submodule <name>"

7.) Löschen Sie die jetzt nicht verfolgten Submodul-Dateien

rm -rf path_to_submodule
Ishan Liyanage
quelle
Danke dafür. Für mich musste ich die Reihenfolge der ersten drei Schritte auf 3), 1), 2) ändern. Tun 1) gab zuerst fatal: no submodule mapping found in .gitmodules for path 'submodule_name'in Schritt 3. Beide Schritte waren jedoch notwendig. (Git v2.8.2)
U007D
13

Ich habe kürzlich ein Git-Projekt herausgefunden, das viele nützliche git-bezogene Befehle enthält: https://github.com/visionmedia/git-extras

Installieren Sie es und geben Sie Folgendes ein:

git-delete-submodule submodule

Dann sind die Dinge erledigt. Das Submodulverzeichnis wird aus Ihrem Repo entfernt und ist weiterhin in Ihrem Dateisystem vorhanden. Sie können die Änderung dann wie folgt festschreiben : git commit -am "Remove the submodule".

Chien-Wei Huang
quelle
Sie können dies als nennen git delete-submodule, wie git-extrasBedürfnisse in dem Weg zur Arbeit. Beachten Sie auch, dass ich empfehle, nicht zu verwendengit-extras , da viele Teile davon extrem fehlerhaft und gefährlich sind . IE git-delete-submoduleentfernt möglicherweise den falschen Pfad unten .git/modules/*, da davon ausgegangen wird, dass das Modul und der Pfad identisch sind (was häufig nicht der Fall ist), und es funktioniert nicht richtig, wenn Sie versuchen, ein Submodul innerhalb eines Submoduls zu entfernen. git-extraskönnte zu 99% hilfreich sein, aber bitte beschweren Sie sich nicht, wenn bei der Verwendung etwas völlig schief geht. DU WURDEST GEWARNT!
Tino
10

Ich musste John Douthats Schritte einen Schritt weiter und cdin das Verzeichnis des Submoduls gehen und dann das Git-Repository entfernen:

cd submodule
rm -fr .git

Dann könnte ich die Dateien als Teil des übergeordneten Git-Repositorys ohne den alten Verweis auf ein Submodul festschreiben.

Kyle Clegg
quelle
Ich musste dies auch tun, um einen Fehler "fatal: Not a git repository:" zu überwinden, wenn ich versuchte, den git rm --cacheSchritt auszuführen.
RickDT
9

Hier sind die 4 Schritte, die ich für notwendig oder nützlich hielt (wichtige zuerst):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

In der Theorie , git rmin Schritt 1 sollte sich darum kümmern. Hoffentlich kann der zweite Teil der OP-Frage eines Tages positiv beantwortet werden (dies kann in einem Befehl erfolgen).

Ab Juli 2017 ist jedoch Schritt 2 erforderlich, um Daten zu entfernen. .git/modules/Andernfalls können Sie das Submodul in Zukunft nicht mehr hinzufügen.

Sie können wahrscheinlich mit den obigen zwei Schritten für Git 1.8.5+ durchkommen, wie Tinlyx 'Antwort vermerkt hat, wie allegit submodule Befehle zu funktionieren scheinen.

Schritt 3 entfernt den Abschnitt für the_submodulein der Datei.git/config . Dies sollte der Vollständigkeit halber erfolgen. (Der Eintrag kann Probleme für ältere Git-Versionen verursachen, aber ich habe keine zum Testen).

Aus diesem Grund schlagen die meisten Antworten die Verwendung vor git submodule deinit. Ich finde es expliziter und weniger verwirrend zu benutzen git config -f .git/config --remove-section. Nach der git-Submodul Dokumentation , git deinit:

Heben Sie die Registrierung der angegebenen Submodule auf ... Wenn Sie wirklich ein Submodul aus dem Repository entfernen und festschreiben möchten, verwenden Sie stattdessen git-rm [1] .

Last but not least, wenn Sie dies nicht tun git commit, werden / können Sie dabei einen Fehler erhalten git submodule summary(ab Git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

Dies ist unabhängig davon, ob Sie die Schritte 2 oder 3 ausführen.

Laser-
quelle
7
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

quelle
7

Ich habe gerade die versteckte Datei .submodule (vergessenen genauen Namen) gefunden, sie enthält eine Liste ... Sie können sie auf diese Weise einzeln löschen. Ich hatte gerade eine, also habe ich sie gelöscht. Einfach, aber es könnte Git durcheinander bringen, da ich nicht weiß, ob irgendetwas mit dem Submodul verbunden ist. Scheint bis jetzt in Ordnung zu sein, abgesehen von Libetpans üblichem Upgrade-Problem, aber das hat (hoffentlich) nichts damit zu tun.

Es wurde bemerkt, dass niemand ein manuelles Löschen gepostet hat, also hinzugefügt

Stephen J.
quelle
Es ist.gitmodules
Arialdo Martini
7

Mit Git 2.17 und höher ist es nur:

git submodule deinit -f {module_name}
git add {module_name}
git commit
Albert Tobac
quelle
Hat nicht funktioniert, weder für git 2.17.1noch git 2.20.1. Allerdings verwendet git rmstatt git addfür beide gearbeitet. Anmerkungen: Wird -fnicht benötigt, wenn die Dinge sauber sind. Achten Sie darauf, nie Optionen zu verwenden , mit , gitwenn Sie vor unbeabsichtigtem Datenverlust schützen wollen. Beachten Sie auch, dass dies .git/modules/{module_name}an Ort und Stelle bleibt . Es wird empfohlen, es dort zu belassen, da gitdie richtige (!) Hilfe zum Drucken gedruckt wird, wenn etwas aufgrund dessen blockiert ist.
Tino
4

Wenn Sie gerade das Submodul hinzugefügt haben und beispielsweise einfach das falsche Submodul hinzugefügt haben oder es an der falschen Stelle hinzugefügt haben, git stashlöschen Sie einfach den Ordner. Dies setzt voraus, dass das Hinzufügen des Submoduls das einzige ist, was Sie im letzten Repo getan haben.

Botbot
quelle
3

Zum Nutzen des Lesers wird hier versucht, dies zusammenzufassen und eine schrittweise Anleitung zu geben, wie dies zu tun ist, wenn die Dinge nicht wie erwartet funktionieren. Im Folgenden finden Sie die getestete und sichere Methode für gitVersionen 2.17und höher , um ein Submodul zu entfernen :

submodule="path/to/sub"              # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
  • Wenn dies bei Ihnen nicht funktioniert, siehe unten.
  • Keine Optionen. Nichts gefährliches. Und denken Sie nicht einmal daran, mehr zu tun!
  • Getestet mit Debian Buster 2.20.1und Ubuntu 18.042.17.1 .
  • "$submodule" ist nur zu betonen, wo der Name zu setzen ist, und dass Sie mit Leerzeichen und dergleichen vorsichtig sein müssen
  • Wenn unter Windows, ignorieren Sie die erste Zeile und ersetzen Sie "$submodule"einen ordnungsgemäß angegebenen Pfad zum Submodul durch die Windows-Methode. (Ich bin nicht Windows)

Warnung!

Berühren Sie niemals die Innenseiten des .gitVerzeichnisses selbst! Innen bearbeiten.git betritt die dunkle Seite. Bleib um jeden Preis weg!

Und ja, Sie können dafür verantwortlich machen git, da viele nützliche Dinge fehltengit in der Vergangenheit . Wie ein richtiger Weg, um Submodule wieder zu entfernen.

Ich denke, es gibt einen sehr gefährlichen Teil in der Dokumentation von git submodule. Es wird empfohlen, sich zu entfernen $GIT_DIR/modules/<name>/. Nach meinem Verständnis ist dies nicht nur einfach falsch, es ist äußerst gefährlich und verursacht in Zukunft große Kopfschmerzen! Siehe unten.

Beachten Sie, dass

git module deinit

ist die direkte Umkehrung zu

git module init

aber

git submodule deinit -- module
git rm -- module

ist auch ganz umgekehrt

git submodule add -- URL module
git submodule update --init --recursive -- module

weil einige Befehle im Grunde mehr als nur eine einzige Sache tun müssen:

  • git submodule deinit -- module
    • (1) Aktualisierungen .git/config
  • git rm
    • (2) entfernt die Dateien des Moduls
    • (3) entfernt dadurch rekursiv die Submodule des Submoduls
    • (4) Aktualisierungen .gitmodules
  • git submodule add
    • zieht die Daten ein .git/modules/NAME/
    • (1) tut git submodule init, also Updates.git/config
    • (2) git submodule updatecheckt das Modul also nicht rekursiv aus
    • (4) Aktualisierungen .gitmodules
  • git submodule update --init --recursive -- module
    • zieht bei Bedarf weitere Daten ein
    • (3) prüft die Submodule des Submoduls rekursiv

Dies kann nicht vollständig symmetrisch sein, da es wenig sinnvoll ist, es streng symmetrisch zu halten. Es sind einfach nicht mehr als zwei Befehle erforderlich. Auch das "Abrufen der Daten" ist implizit, da Sie es benötigen. Das Entfernen der zwischengespeicherten Informationen wird jedoch nicht durchgeführt, da dies überhaupt nicht erforderlich ist und möglicherweise wertvolle Daten löscht.

Für Neulinge ist das wirklich rätselhaft, aber im Grunde ist es eine gute Sache: macht giteinfach das Offensichtliche und macht das richtig und versucht nicht einmal mehr zu tun. gitist ein Werkzeug, das einen zuverlässigen Job machen muss, anstatt nur eine andere "Eierlegende Wollmilchsau" zu sein ("Eierlegende Wollmilchsau" bedeutet für mich "eine böse Version eines Schweizer Taschenmessers").

Ich verstehe also Beschwerden von Menschen und sage: "Warum tut das nicht gitdas Offensichtliche für mich?" Dies liegt daran, dass "offensichtlich" hier vom Standpunkt abhängt. Zuverlässigkeit in jeder Situation ist weitaus wichtiger. Daher ist das, was für Sie oft offensichtlich ist, nicht in allen möglichen technischen Situationen das Richtige. Bitte denken Sie daran: AFAICSgit folgt dem technischen Weg, nicht dem sozialen. (Daher der kluge Name: git)

Wenn dies fehlschlägt

Die obigen Befehle können aus folgenden Gründen fehlschlagen:

  • Dein gitist zu alt. Dann verwenden Sie eine neuere git. (Siehe unten, wie es geht.)
  • Sie haben nicht festgeschriebene Daten und können Daten verlieren. Dann legen Sie sie besser zuerst fest.
  • Ihr Submodul ist in gewissem git cleanSinne nicht sauber . Reinigen Sie dann zuerst Ihr Submodul mit diesem Befehl. (Siehe unten.)
  • Sie haben in der Vergangenheit etwas getan, das von nicht unterstützt wird git. Dann bist du auf der dunklen Seite und die Dinge werden hässlich und kompliziert. (Möglicherweise wird das Problem durch die Verwendung eines anderen Computers behoben.)
  • Vielleicht gibt es noch mehr Möglichkeiten zum Scheitern, die mir nicht bekannt sind (ich bin nur ein gitPower-User).

Mögliche Korrekturen folgen.

Verwenden Sie eine neuere git

Wenn Ihre Maschine zu alt ist, ist keine submodule deinitin Ihrer git. Wenn Sie Ihre nicht aktualisieren möchten (oder können), verwenden Sie giteinfach eine andere Maschine mit einer neueren git! gitsoll vollständig verteilt sein, sodass Sie einen anderen verwenden können git, um die Arbeit zu erledigen:

  • workhorse:~/path/to/worktree$ git status --porcelain darf nichts ausgeben! Wenn ja, bereinigen Sie zuerst die Dinge!
  • workhorse:~/path/to/worktree$ ssh account@othermachine
  • othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
  • Jetzt mach das Submodul-Zeug
  • othermachine:~/TMPWORK$ git commit . -m . && exit
  • workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
  • workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD. Wenn dies nicht funktioniert, verwenden Siegit reset --soft FETCH_HEAD
  • Jetzt bereinige Dinge, bis git statuses wieder sauber ist. Sie können dies tun, weil Sie es dank des ersten Schritts schon einmal sauber hatten.

Dies othermachinekann eine VM oder eine Ubuntu-WSL unter Windows sein. Sogar a chroot(aber ich gehe davon aus, dass Sie kein Root sind, denn wenn Sie es sind root, sollte es einfacher sein, auf das neuere zu aktualisieren git).

Beachten Sie ssh, dass es zahlreiche Möglichkeiten zum Transport von gitRepositorys gibt , wenn Sie nicht einsteigen können . Sie können Ihren Arbeitsbaum auf einen USB-Stick (einschließlich des .gitVerzeichnisses) kopieren und vom Stick klonen. Klonen Sie die Kopie, um die Dinge wieder sauber zu machen. Dies kann eine PITA sein, falls Ihre Submodule nicht direkt von einer anderen Maschine aus zugänglich sind. Aber auch dafür gibt es eine Lösung:

git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX

Sie können diese Multiplikation verwenden, und diese wird in gespeichert $HOME/.gitconfig . Etwas wie

git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/

schreibt URLs wie neu

https://github.com/XXX/YYY.git

in

/mnt/usb/repo/XXX/YYY.git

Es ist einfach, wenn Sie sich an leistungsstarke gitFunktionen wie diese gewöhnen .

Bereinigen Sie die Dinge zuerst

Die manuelle Reinigung ist gut, da Sie auf diese Weise möglicherweise einige Dinge erkennen, die Sie vergessen haben.

  • Wenn sich git über nicht gespeicherte Sachen beschwert, legen Sie sie fest und schieben Sie sie an einen sicheren Ort.
  • Wenn git sich über einige Reste beschwert, git statusundgit clean -ixfd dein Freund ist
  • Versuchen Sie eine der Optionen zu verzichten rmund deinitso lange wie möglich. Optionen (wie -f) für gitsind gut, wenn Sie ein Profi sind. Aber als Sie hierher kamen, sind Sie wahrscheinlich nicht so erfahren in der submoduleGegend. Also besser auf Nummer sicher gehen.

Beispiel:

$ git status --porcelain
 M two
$ git submodule deinit two
error: the following file has local modifications:
    two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
    md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
    tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
  NEW
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each
    5: quit                 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'

Sie sehen, es wird nicht -fbenötigt submodule deinit. Wenn die Dinge in gewissem git cleanSinne sauber sind . Beachten Sie auch, dass dies git clean -xnicht benötigt wird. Dies bedeutet, dass git submodule deinitnicht verfolgte Dateien, die ignoriert werden , bedingungslos entfernt werden. Dies ist normalerweise das, was Sie wollen, aber vergessen Sie es nicht. Manchmal sind ignorierte Dateien wertvoll, z. B. zwischengespeicherte Daten, deren erneute Berechnung Stunden bis Tage dauert.

Warum nie entfernen $GIT_DIR/modules/<name>/?

Wahrscheinlich möchten Benutzer das zwischengespeicherte Repository entfernen, weil sie Angst haben, später auf ein Problem zu stoßen. Dies ist wahr, aber auf dieses "Problem" zu stoßen, ist der richtige Weg, es zu lösen! Weil die Lösung einfach ist und richtig gemacht wird, können Sie glücklich leben. Dies vermeidet umständlichere Probleme als wenn Sie die Daten selbst entfernen.

Beispiel:

mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two

Die letzte Zeile gibt folgenden Fehler aus:

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

Warum dieser Fehler? Weil .git/modules/two/zuvor von https://github.com/hilbix/empty.git ausgefüllt wurde und jetzt von etwas anderem neu ausgefüllt werden soll, nämlich https://github.com/hilbix/src.git . Sie werden dies nicht sehen, wenn Sie es erneut von https://github.com/hilbix/empty.git ausfüllen

Was nun? Nun, mach genau das, was dir gesagt wurde! Verwenden--name someunusedname

git submodule add --name someunusedname https://github.com/hilbix/src.git two

.gitmodules dann sieht es so aus

[submodule "someunusedname"]
    path = two
    url = https://github.com/hilbix/src.git

ls -1p .git/modules/ gibt

someunusedname/
two/

Auf diese Weise können Sie in Zukunft Zweige / Commit vorwärts und rückwärts wechseln und werden nie wieder in Schwierigkeiten geraten, two/da zwei verschiedene (und möglicherweise inkompatible) Upstream-Repositorys vorhanden sind. Und das Beste ist: Sie behalten beide auch lokal zwischengespeichert.

  • Dies gilt nicht nur für Sie. Dies gilt auch für alle anderen Benutzer Ihres Repositorys.
  • Und Sie verlieren nicht die Geschichte. Falls Sie vergessen haben, die neueste Version des alten Submoduls zu pushen, können Sie die lokale Kopie eingeben und dies später tun. Beachten Sie, dass es häufig vorkommt, dass jemand vergisst, einige Submodule zu pushen (da dies eine PITA für Neulinge ist, bis sie sich daran gewöhnt haben git).

Wenn Sie jedoch das zwischengespeicherte Verzeichnis entfernt haben, stoßen beide unterschiedlichen Kassen aufeinander, da Sie die --nameOptionen nicht verwenden , oder? Jedes Mal, wenn Sie zur Kasse gehen, müssen Sie das .git/modules/<module>/Verzeichnis möglicherweise immer wieder entfernen . Dies ist äußerst umständlich und macht es schwierig, so etwas zu verwenden git bisect.

Es gibt also einen sehr technischen Grund, dieses Modulverzeichnis als Platzhalter beizubehalten. Leute, die empfehlen, etwas unten zu entfernen, .git/modules/wissen es entweder nicht besser oder vergessen zu sagen, dass dies leistungsstarke Funktionen wie git bisectnahezu unmöglich macht, wenn dies eine solche Inkompatibilität mit Submodulen überschreitet.

Ein weiterer Grund ist oben gezeigt. Schau dir das an ls. Was siehst du dort?

Nun, die 2. Variante des Moduls two/ist nicht unter .git/modules/two/, es ist unter .git/modules/someunusedname/! Also sind Dinge wie git rm $module; rm -f .git/module/$modulevöllig falsch! Sie müssen entweder konsultieren module/.gitoder .gitmodulesdas Richtige zum Entfernen finden!

So fallen nicht nur die meisten anderen Antworten in diese gefährliche Falle, auch sehr beliebte gitErweiterungen hatten diesen Fehler ( er ist jetzt dort behoben )! Behalten Sie also besser das .git/Verzeichnis in der Hand, wenn Sie nicht genau wissen, was Sie tun!

Und aus philosophischer Sicht ist das Löschen der Geschichte immer falsch! Abgesehen von der Quantenmechanik , wie üblich, aber das ist etwas völlig anderes.

Zu Ihrer Information, Sie haben es wahrscheinlich erraten: hilbix ist mein GitHub-Account.

Tino
quelle
Diese Enzyklopädie eines Beitrags sollte in klarere Abschnitte mit größeren / klareren Unterüberschriften unterteilt werden, um die tatsächliche Antwort und die verschiedenen Abschnitte "Fehlerbehebung" / etc anzuzeigen.
Andrew
2

Zusammenfassend sollten Sie Folgendes tun:

Setze path_to_submodule var (kein abschließender Schrägstrich):

path_to_submodule=path/to/submodule

Löschen Sie die entsprechende Zeile aus der .gitmodules-Datei:

git config -f .gitmodules --remove-section submodule.$path_to_submodule

Löschen Sie den entsprechenden Abschnitt aus .git / config

git config -f .git/config --remove-section submodule.$path_to_submodule

Heben Sie die Bühne auf und entfernen Sie $ path_to_submodule nur aus dem Index (um zu verhindern, dass Informationen verloren gehen).

git rm --cached $path_to_submodule

Verfolgen Sie Änderungen an .gitmodules

git add .gitmodules

Übernehmen Sie das Superprojekt

git commit -m "Remove submodule submodule_name"

Löschen Sie die jetzt nicht verfolgten Submodul-Dateien

rm -rf $path_to_submodule

rm -rf .git/modules/$path_to_submodule

Siehe auch: Alternative Richtlinien

Rahul Dapke
quelle
Können Sie dies bitte erweitern, indem Sie ein Submodul nach einem 'git submodule add' entfernen, ohne es jemals festgeschrieben zu haben? Ich gehe davon aus, dass in diesem Fall kein Commit erforderlich ist, um das Submodul zu entfernen, oder?
Carlo Wood
Ich denke du musst das tauschen git rm --cached $path_to_submoduleund git add .gitmodulesnein? Beim ersten Befehl ist ein Fehler fatal: Please stage your changes to .gitmodules or stash them to proceedaufgetreten : Ich hatte nicht bereitgestellte Änderungen an .gitmodules. Das git add .gitmoduleserste zu lösen löst das.
Carlo Wood
2

Das ist einfach:

  1. Entfernen Sie den Abschnitt von .gitmodules
  2. Anruf: git add .gitmodules
  3. Anruf: git submodule deinit <path to submodule>
  4. Anruf: git rm <path to submodule>
  5. Commit und Push

Sie müssen die Moduldateien in Ihrem Projekt manuell löschen.

Schwarz
quelle
2
Für mich war es genug anzurufen git submodule deinit <submodule_name>und git rm <path_to_submodule>. Der letzte Befehl löscht automatisch den Eintrag in der .gitmodules. Git 2.17
Dmytro Ovdiienko
1

Ich habe ein Bash-Skript erstellt, um den Entfernungsprozess zu vereinfachen. Es wird auch geprüft, ob Änderungen im Repo nicht gespeichert wurden, und um Bestätigung gebeten. Es os xwäre interessant zu wissen, ob es auch unter gängigen Linux-Distributionen funktioniert:

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f

Techradar
quelle
0

In der neuesten Version von Git sind nur 4 Operationen erforderlich, um das Git-Submodul zu entfernen.

  • Entfernen Sie den entsprechenden Eintrag in .gitmodules
  • Bühnenwechsel git add .gitmodules
  • Entfernen Sie das Submodulverzeichnis git rm --cached <path_to_submodule>
  • Verpflichte es git commit -m "Removed submodule xxx"
Rashok
quelle
0

Falls Sie dies in einem einzeiligen Befehl mit dem Bash-Skript wie folgt tun müssen :

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

Erstellen Sie eine Bash-Skriptdatei im $HOMEVerzeichnis mit dem Namen remove_submodule.sh:

#!/bin/bash

git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet

Chetabahana
quelle
0
  • Ein Submodul kann durch Ausführen gelöscht werden git rm <submodule path> && git commit. Dies kann mit rückgängig gemacht werden git revert.
    • Durch das Löschen werden die Tracking-Daten des Superprojekts entfernt, die sowohl der Gitlink-Eintrag als auch der Abschnitt in der .gitmodulesDatei sind.
    • Das Arbeitsverzeichnis des Submoduls wird aus dem Dateisystem entfernt, das Git-Verzeichnis wird jedoch beibehalten, um das Auschecken früherer Commits zu ermöglichen, ohne dass ein Abruf aus einem anderen Repository erforderlich ist.
  • Um ein Submodul vollständig zu entfernen, löschen Sie es zusätzlich manuell$GIT_DIR/modules/<name>/ .

Quelle: git help submodules

Nikhil
quelle
-1

Git-Submodul entfernen

Um ein gitSubmodul zu entfernen, sind weniger als 4 Schritte erforderlich.

  1. Entfernen Sie den entsprechenden Eintrag in der .gitmodulesDatei. Der Eintrag könnte wie unten erwähnt sein
[submodule "path_to_submodule"]
    path = path_to_submodule
    url = url_path_to_submodule
  1. Bühnenwechsel git add .gitmodules
  2. Entfernen Sie das Submodulverzeichnis git rm --cached <path_to_submodule>.
  3. Übernehmen Sie es git commit -m "Removed submodule xxx"und drücken Sie.

Weitere 2 Schritte, die unten erwähnt werden, sind erforderlich, um das Submodul in einer lokal geklonten Kopie vollständig zu reinigen.

  1. Entfernen Sie den entsprechenden Eintrag in der .git/configDatei. Der Eintrag könnte wie unten erwähnt sein
[submodule "path_to_submodule"]
    url = url_path_to_submodule
  1. Tun rm -rf .git/modules/path_to_submodule

Diese 5. und 6. Schritte erzeugen keine Änderungen, die festgeschrieben werden müssen.

Rashok
quelle
Es wäre viel einfacher, wenn Sie git submodule deinit git-scm.com/docs/git-submodule#Documentation/…
Black verwenden würden.