Frage Wie entferne ich ein Submodul?


Wie entferne ich ein Git Submodul?

Übrigens, gibt es einen Grund, den ich nicht einfach machen kann

git submodule rm whatever

?


3019
2017-08-11 14:31


Ursprung


Antworten:


Schon seit git1.8.3 (22. April 2013):

Es gab keine Porzellan-Art zu sagen "Ich interessiere mich nicht mehr für dieses Submodul", sobald Sie Ihr Interesse an einem Submodul mit "submodule init".
  "submodule deinit"ist der Weg dazu.

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

Zusammenfassung

Der 3-Schritte-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 erwähnt Daniel Schroederist es Antwortenund zusammengefasst von Eonil im die Kommentare:

Diese Blätter .git/modules/<path-to-submodule>/ unverändert.
  Wenn Sie also ein Submodul einmal 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 verwenden "git rm"auf einem Submodul entfernt den Arbeitsbaum des Submoduls von dem des Superprojekts und des Gitlinks aus dem Index.
  Aber der Abschnitt des Submoduls in .gitmodules bleibt unberührt, was ein Überbleibsel des jetzt entfernten Submoduls ist und Benutzer irritieren könnte (im Gegensatz zur Einstellung in .git/config, dies muss als Erinnerung daran bleiben, dass der Benutzer Interesse an diesem Submodul gezeigt hat, so dass es später wieder aufgefüllt wird, wenn ein älteres Commit ausgecheckt wird).

Lassen "git rm"dem Benutzer helfen, nicht nur das Submodul aus dem Arbeitsbaum zu entfernen, sondern auch das"submodule.<submodule name>"Abschnitt von der .gitmodules Datei und Bühne beide.


git submodule deinit: Es stammt aus dieser Patch:

Mit "git submodule init"Der Benutzer ist in der Lage, git zu sagen, dass sie sich um ein oder mehrere Submodule kümmern und möchte es beim nächsten Anruf bei"git submodule update".
  Aber derzeit gibt es keinen einfachen Weg, sie können git sagen, dass sie sich nicht mehr für ein Submodul interessieren und den lokalen Arbeitsbaum loswerden wollen (es sei denn, der Benutzer weiß viel über Submodul-Interna und entfernt die "submodule.$name.url"Einstellung von .git/config zusammen mit dem Baum selbst).

Helfen Sie diesen Benutzern mit einem 'deinit' Befehl.
  Dies entfernt das Ganze submodule.<name> Abschnitt von .git/config entweder für das Gegebene   Untermodul (e) (oder für alle diejenigen, die initialisiert wurden, wenn.'ist gegeben).
  Fehler, wenn der aktuelle Arbeitsbaum Änderungen enthält, es sei denn, er wird erzwungen.
  Beschreibe, wenn für ein in der Befehlszeile angegebenes Submodul die URL-Einstellung nicht gefunden werden kann .git/config, aber dennoch nicht versagen.

Dies ist bei den (De-) Initialisierungsschritten (.git/config und .git/modules/xxx)

Seit git1.8.5, der git rm dauert ebenfalls Pflege der:

  • "add'Schritt, der die URL eines Submoduls in der .gitmodules Datei: Es muss für Sie entfernt werden.
  • das Submodul spezieller Eintrag (wie dargestellt durch diese Frage): Die git rm entfernt es aus dem Index:
    git rm --cached path_to_submodule(kein 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 normales 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 an eine C-Funktion.

Sehen commit 2e61273, commit 1342476 (14 Jan 2018) von Prathamesh Chavan (pratham-pc).
(Zusammengeführt von Junio ​​C Hamano - gitster - im 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} "$@"

1796
2018-04-23 05:57



Über die Seite Git Submodul Lernprogramm:

Um ein Submodul zu entfernen, müssen Sie:

  1. Löschen Sie den relevanten Abschnitt aus der .gitmodules Datei.
  2. Stage die .gitmodules Änderungen git add .gitmodules
  3. Löschen Sie den relevanten Abschnitt aus .git/config.
  4. Lauf git rm --cached path_to_submodule (kein Schrägstrich)
  5. Lauf rm -rf .git/modules/path_to_submodule
  6. Verpflichten git commit -m "Removed submodule <name>"
  7. Löschen Sie die nun nicht gefundenen Submoduldateien
    rm -rf path_to_submodule

Siehe auch: alternative Schritte unten.


3144
2018-01-18 23:30



Nur eine Notiz. Seit Git 1.8.5.2 werden zwei Befehle ausgeführt:

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

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

--Update (07/05/2017) -

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

Wie in den Kommentaren und Andere Antwort, die beiden Befehle (obwohl funktionell ausreichend, um ein Submodul zu entfernen), hinterlassen eine Spur in der [submodule "the_submodule"] Abschnitt von .git/config (Stand Juli 2017), die mit einem dritten Befehl entfernt werden können:

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

331
2018-04-13 08:51



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

Ein Submodul, das mit Git 1.7.8 oder höher geklont wurde, hinterlässt in Ihrem lokalen Repo höchstens vier Spuren von sich. Der Prozess zum Entfernen dieser vier Spuren ist durch die folgenden drei Befehle gegeben:

# 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

244
2018-03-02 16:07



Einfache Schritte

  1. Entfernen Sie die Konfigurationseinträge:
    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. Löschen Sie nicht verwendete Dateien:
    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 addfügt es nur hinzu .gitmodules, aber sobald du es getan hast git submodule init, fügte es hinzu .git/config.

Wenn Sie also die Module entfernen, aber schnell wiederherstellen möchten, dann tu folgendes:

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

Es ist eine gute Idee zu tun git rebase HEAD zuerst und git commit Am Ende, wenn Sie dies in ein Skript schreiben.

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


183
2017-08-11 14:43



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


80
2017-10-12 10:17



Sie müssen den Eintrag entfernen .gitmodules und .git/config, und entfernen Sie das Verzeichnis des Moduls aus dem Verlauf:

git rm --cached path/to/submodule

Wenn du auf die Mailingliste von git schreibst, wird wahrscheinlich jemand ein Shell-Skript für dich schreiben.


46
2017-11-01 21:43



So entfernen Sie ein hinzugefügtes Submodul mit:

git submodule add blah@blah.com:repos/blah.git lib/blah

Lauf:

git rm lib/blah

Das ist es.

Für alte Versionen von Git (ca. ~ 1.8.5) verwende:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

45
2017-07-09 17:55