24 Frage: Wie entferne ich ein Submodul?

Frage erstellt am Fri, Sep 7, 2018 12:00 AM

Wie entferne ich ein Git-Submodul?

Gibt es einen Grund, den ich nicht einfach machen kann?  git submodule rm whatever?

    
3244
  1. Die einfache Antwort stackoverflow.com/a/21211232/94687 ist jetzt die richtige und sollte so markiert werden. Jetzt sind es einfach git rm modulename und rm -rf .git/modules/modulename
    2015-06-15 15: 46: 52Z
  2. 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. In dieser Antwort wird dies auch genauer erläutert: stackoverflow.com/a/36593218/1562138
    2016-04-13 09: 02: 20Z
  3. Ich fand diesen Artikel sehr hilfreich beim Entfernen von Submodulen. Es enthält Informationen zum Entfernen von Einträgen in den Dateien .gitsubmodules und .git /config. link
    2016-05-15 17: 46: 21Z
  4. Bitte sparen Sie sich etwas Zeit und gehen Sie direkt zu der Antwort, die (in 2017) funktioniert: stackoverflow.com/a/36593218/528313
    2017-01-16 12: 57: 34Z
  5. Ich habe zwei Tage lang Probleme mit Submodulen. Der Durchbruch kam, als ich Folgendes fand: forums.developer.apple.com/thread/13102. Grundsätzlich tun sich Xcode und andere Apps schwer damit, URLs zu erweitern, die "~" enthalten. Sobald ich ssh: //username@server.remoteHost.com/~/git/MyRepo.git in ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git geändert habe (den tatsächlichen Pfad nachschlagen) auf Ihrem Server), verschwand die ganze Verrücktheit mit zehn Minuten. Siehe auch stackoverflow.com/questions/32833100/…
    2018-02-09 12: 48: 33Z
  6. 24 Antworten                              24                         

    Seit git1 .8.3 (22. April 2013) :

      

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

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

    Zusammenfassung

    Der Entfernungsprozess in drei Schritten würde dann lauten:

     
    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
    

    Erklärung

    rm -rf: Dies wird in Daniel Schroeder 's Antwort und zusammengefasst von Eonil in die Kommentare :

      

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


    git rm: Siehe Festschreiben 95c16418 :

      

    Wenn Sie derzeit "git rm" für ein Submodul verwenden, wird der Arbeitsbaum des Submoduls aus dem des Superprojekts und entferntder gitlink aus dem index.
      Der Abschnitt des Submoduls in .gitmodules bleibt jedoch unberührt. Dies ist ein Überbleibsel des jetzt entfernten Submoduls und kann Benutzer irritieren (im Gegensatz zu der Einstellung in .git/config muss dies als Erinnerung dienen, dass der Benutzer Interesse an diesem Submodul gezeigt hat, so wie es sein wird wird später erneut ausgefüllt, wenn ein älteres Commit ausgecheckt wird.

         

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


    git submodule deinit: Dies ist das Ergebnis Patch :

      

    Mit "git submodule init" kann der Benutzer git mitteilen, dass er sich für ein oder mehrere Submodule interessiert, und möchte, dass sie beim nächsten Aufruf von "git submodule update" aufgefüllt werden.
      Momentan gibt es jedoch keine einfache Möglichkeit, zu erkennen, dass sie sich nicht mehr um ein Submodul kümmern und den lokalen Arbeitsbaum entfernen möchten (es sei denn, der Benutzer weiß viel über die Interna des Submoduls und entfernt die Einstellung "submodule.$name.url" von .git/config zusammen mit der Arbeitsbaum selbst).

         

    Helfen Sie diesen Nutzern, indem Sie den Befehl " deinit " eingeben.
      Dies entfernt den gesamten submodule.<name>-Abschnitt von .git/config, entweder für die gegebene   Submodul (e) (oder für alle, die initialisiert wurden, wenn '.' angegeben ist).
      Schlägt fehl, 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 in .git/config nicht gefunden werden kann, aber dennoch nicht fehlschlägt.

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

    ausgeführt werden

    Seit git1.8.5 kümmert sich die git rm auch um Folgendes:

    • 'add' Schritt, der die URL eines Submoduls in der .gitmodules-Datei aufzeichnet: Es muss für Sie entfernt werden.
    • das Submodul special entry (wie durch diese Frage veranschaulicht): Das git rm entfernt sie aus dem Index:
      git rm --cached path_to_submodule (kein Trailing) Schrägstrich)
      Dadurch wird das im Index gespeicherte Verzeichnis mit einem speziellen Modus "160000" entfernt und als Untermodul-Stammverzeichnis gekennzeichnet.

    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.

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

    git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
      ${GIT_QUIET:+--quiet} \
      ${prefix:+--prefix "$prefix"} \
      ${force:+--force} \
      ${deinit_all:+--all} "$@"
    
        
    1975
    2018-02-18 18: 33: 57Z
    1. Können Sie ein Anwendungsbeispiel für submodule deinit angeben?
      2013-04-28 18: 42: 55Z
    2. @ yourfriendzak hier ist ein Beispiel für jemanden, der es erfolgreich verwendet: stackoverflow.com /a /16161950/6309 . Beachten Sie jedoch, dass 1.8.3 entgegen meiner ursprünglichen Ansicht noch nicht veröffentlicht wurde! Unter Unix können Sie es aus den Quellen kompilieren.
      2013-04-28 18: 45: 11Z
    3. @ HamishDowner der spezielle Eintrag sollte weg sein (das Verzeichnis ist kein Submodul mehr) und die .gitmodules sollte in Ordnung sein, aber ich würde immer noch alles mit dem überprüfen .git-Verzeichnis (dh die lokale Konfiguration in Ihrem lokalen Repository: Diese wird von einem git pull nicht geändert)
      2013-06-04 15: 40: 48Z
    4. @ Jayen Ja, wenn Sie das Entfernen des .gitmodules-Eintrags und das Entfernen des speziellen Eintrags im Index festlegen und dieses Repo verschieben, können andere es und das abrufenSubmodul wird weg sein.
      2013-08-02 06: 04: 12Z
    5. In der aktuellen Version (v1.9 +) macht der einfache alte git rm submodule genau das, was Sie wollen, wie andere bereits gesagt haben.
      2014-06-12 17: 36: 29Z

    Über die Seite Git-Submodul-Tutorial :

    Um ein Submodul zu entfernen, müssen Sie folgende Schritte ausführen:

    1. Löschen Sie den relevanten Abschnitt aus der .gitmodules-Datei.
    2. Stellen Sie die .gitmodules-Änderungen git add .gitmodules bereit
    3. Löschen Sie den relevanten Abschnitt aus .git/config.
    4. Führen Sie git rm --cached path_to_submodule aus (kein abschließender Schrägstrich).
    5. Führen Sie rm -rf .git/modules/path_to_submodule aus
    6. Übernehmen Sie git commit -m "Removed submodule <name>"
    7. Löschen Sie die jetzt nicht verfolgten Submoduldateien
      rm -rf path_to_submodule

    Siehe auch : alternative Schritte .

        
    3293
    05.01.2018 10: 56: 34Z
    1. "Und übrigens, gibt es einen Grund, warum ich das Submodul rm überhaupt nicht einfach giten kann?"
      2011-01-20 19: 04: 03Z
    2. @ abernier Eine knappe Antwort könnte lauten "weil es keinen solchen Befehl gibt". Ich vermute, dass sie versuchen, das Entfernen von Submodul-Dateien vs Submodul-Konfiguration explizit zu machen, um versehentlichen Datenverlust zu vermeiden. Vielleicht würde eine Person denken, dass git submodule rm einfach die Submodulregistrierung entfernt, und wäre überrascht, wenn der Befehl auch das lokale Repository löscht. Alle lokalen Änderungen würden unwiederbringlich verloren gehen. Und vielleicht würde eine andere Person denken, dass nur die Dateien entfernt würden.
      2011-01-21 01: 50: 04Z
    3. Ehrlich gesagt, ich weiß nicht warum. Ich hoffe, dass sie einen Befehl hinzufügen. Diese 4 Schritte sind zu kompliziert.
      2011-01-21 01: 56: 33Z
    4. Hier ist ein Bash-Skript, das ein Submodul entfernt. Erstellen Sie einfach einen Git-Alias ​​für submodul-rm. gist.github.com/2491147
      2012-04-25 17: 27: 39Z
    5. Benötigen Sie auch rm -rf .git \modules \submodule name?
      2012-05-22 17: 31: 16Z

    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 in der Antwort von @Mark Cheverton richtig angegeben, verhindert der restliche Ordner .git /modules /the_submodule, dass dasselbe Submodul erneut hinzugefügt oder ersetzt wird, wenn die zweite Zeile nicht verwendet wird, auch wenn Sie das Submodul vorerst entfernt haben in der Zukunft. Wie bei @VonC bereits erwähnt, erledigt git rm den größten Teil der Arbeit auf einem Submodul.

    - Update (07/05/2017) -

    Zur Verdeutlichung ist the_submodule der relative Pfad des Submoduls innerhalb des Projekts. Beispiel: subdir/my_submodule, wenn sich das Untermodul in einem Unterverzeichnis subdir befindet.

    Wie in den Kommentaren und in den anderen Antworten richtig erwähnt, sind die beiden Befehle (obwohl funktional ausreichend, um ein Submodul zu entfernen) Hinterlassen Sie im Abschnitt [submodule "the_submodule"] 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
    
        
    409
    2017-07-06 03: 03: 50Z
    1. Ich arbeite mit der Git-Version 2.4.9 (Apple Git-60) und musste nur rm the_submodule ausführen. Ich habe das gepusht und dann einen Ordner mit dem Namen des Submoduls neu hinzugefügt, und es hat ohne Probleme funktioniert.
      2015-12-03 21: 23: 31Z
    2. Dies entfernt nicht den Submodul-Eintrag aus .git/config. Informationen zum vollständigen Entfernen eines Submoduls finden Sie unter stackoverflow.com/a/36593218/1562138 .
      2016-04-13 08: 53: 21Z
    3. Dies ist 100% absolut brillant und funktioniert. Wow.
      2016-04-20 14: 12: 01Z
    4. @ drevicko Ich habe dies gerade mit Git 2.11.1 getestet und beobachte dasselbe Verhalten wie zuvor. git init && git submodule add <repository> && git rm <name> hinterlässt den Eintrag .git/config und das Verzeichnis .git/modules/<name> sowie dessen Inhalt. Vielleicht haben Sie das Submodul vor dem Entfernen nicht initialisiert?
      2017-02-22 16: 58: 10Z
    5. Ich fühle mich sicherer, wenn ich dieses erste Modul verwende. git submodule deinit -f the_submodule
      2017-03-10 04: 22: 37Z

    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 in Ihrem lokalen Repo höchstens vier Spuren von sich. 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
    
        
    370
    2017-05-21 06: 31: 44Z
    1. Warum hat diese Antwort so wenig positive Stimmen? Bei all diesen populären Antworten fehlt etwas, dies ist das einzige, das wirklich alle Spuren eines Submoduls auf einfachste Weise entfernt. Und beachten Sie: Die Reihenfolge der Befehle ist wichtig.
      2016-09-07 06: 08: 51Z
    2. 2017-01-19 22: 19: 05Z
    3. @ mbdevpl kam 3 Jahre nach der akzeptierten Antwort, und ich glaube, niemand hat es geschafft, das OP davon zu überzeugen, diese zu akzeptieren
      2017-02-20 01: 58: 13Z
    4. Dies ist die nicht komplizierte Antwort für 2018?
      2018-02-02 22: 43: 25Z
    5. Die Datei .gitmodules scheint beim Ausführen dieser Befehle immer noch nicht betroffen zu sein.
      05.09.2018 06: 50: 51Z

    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 Index entfernen:
      git rm --cached $submodulepath
    3. Festschreiben
    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 nachfolgenden Schrägstriche.

    Hintergrund

    Wenn Sie git submodule add ausführen, wird nur .gitmodules hinzugefügt, aber Sobald Sie git submodule init eingegeben haben, wurde .git/config hinzugefügt.

    Wenn Sie also die Module entfernen möchten, diese aber schnell wiederherstellen können, Dann machen Sie einfach Folgendes:

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

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

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

        
    192
    2017-05-24 05: 06: 17Z
    1. Ich hatte viele Submodule (und ein größeres Durcheinander), also musste ich sie durch eine for-Schleife leiten. Da die meisten von ihnen unter einem bestimmten Verzeichnis standenectory und ls output enthielten abschließende Schrägstriche. Ich habe so etwas wie for dir in directory/*; do git rm --cached $dir; done gemacht
      2011-10-09 20: 50: 32Z
    2. Um dies zu erreichen, muss die Liste, die im Skript für das rekursive Löschen verwendet werden kann - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' - - in dem Fall, dass etwas durcheinander ist, wirklich ausgeführt werden. ansonsten nur git submodule | grep -v '^+' | cut -d' ' -f3
      2011-10-12 00: 43: 58Z
    3. , um die Liste der Module abzurufen, bei denen keine lokalen Änderungen vorgenommen wurden - git submodule | grep '^+' | cut -d' ' -f2
      2011-10-12 01: 01: 47Z
    4. Beachten Sie, dass ich submodulename in doppelte Anführungszeichen setzen musste "submodulename" .. unter Bezugnahme auf die .git/config-Datei
      2017-07-20 15: 22: 57Z
    5. # 2 war genau das, wonach ich gesucht habe, danke! +1
      2017-09-26 15: 06: 27Z

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

        
    81
    2016-04-21 11: 36: 26Z
    1. Ich hatte auch damit Probleme. Wenn Sie versuchen, ein Submodul auf demselben Pfad erneut zu installieren, werden die Zweiginformationen an dem von Ihnen angegebenen Speicherort zwischengespeichert, wodurch die Dinge durcheinander gebracht werden.
      2012-03-05 22: 27: 32Z
    2. Danke, das habe ich auch gebraucht. @Anton, ich stimme zu, und ich habe die oben genannte Antwort bearbeitet, um diese Informationen hinzuzufügen.
      2012-09-23 15: 17: 11Z
    3. Ich habe die Option --name verwendet, damit das Ersetzen funktioniert ... siehe stackoverflow.com/questions/14404704/…
      2013-01-18 18: 06: 42Z

    So entfernen Sie ein Submodul, das mit

    hinzugefügt wurde  
    git submodule add blah@blah.com:repos/blah.git lib/blah
    

    Ausführen:

     
    git rm lib/blah
    

    Das war's.

    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
    
        
    52
    03.07.2014 05: 44: 03Z
    1. + 1 in der Tat. Dies ist die einzig richtige Antwort ab Git 1.8.3. Sollte als die richtige akzeptiert werden.
      2014-07-02 18: 26: 20Z
    2. + 1 Richtige und saubere Methode zum Entfernen in neueren Versionen von git.
      2014-08-22 09: 04: 26Z
    3. git rm hinterlässt weiterhin Informationen in .git/modules/. (2.5.4)
      2016-01-02 14: 40: 06Z
    4. @ RudolfAdamkovic funktioniert es bei mir? Beachten Sie, dass der Eintrag für das Submodul nur entfernt wird, wenn der genaue Pfad übereinstimmt. Wenn Sie ein Submodul verschoben und dann git rm verwendet haben, 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 Kombination aus Plattform /Version gefunden haben, bei der dies nicht der Fall ist, sollten Sie wahrscheinlich einen Fehler melden es.
      2016-01-02 15: 48: 19Z
    5. Diese Antwort ist nicht ganz korrekt. git rm hinterlässt Sachen in .git/modules/ dir und .git/config file (ubuntu, git 2.7.4). Andere Antwort funktioniert zu 100%: stackoverflow.com/a/36593218/4973698
      2016-09-07 06: 03: 43Z

    Sie müssen den Eintrag in .gitmodules und .git/config entfernen 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.

        
    48
    2011-12-28 15: 01: 28Z
    1. Es ist kein Shell-Skript erforderlich. Andere Antworten enthalten Befehle zum Entfernen aller Spuren eines Submoduls: stackoverflow.com/a/36593218/4973698
      2016-09-07 06: 06: 05Z

    Mithilfe eines Alias ​​können Sie die von anderen Anbietern bereitgestellten Lösungen 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"
    

    Gib das in deine Git-Konfiguration ein und dann kannst du es tun: git rms path/to/submodule

        
    41
    2012-11-01 21: 43: 37Z

    Zusammenfassend ist dies, was Sie tun sollten:

    1. path_to_submodule var (kein abschließender Schrägstrich) einstellen:

      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. Unstage und entferne $path_to_submodule nur aus dem Index (um zu verhindern, dass Informationen verloren gehen).

      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

    40
    2016-04-21 11: 36: 43Z
    1. Also muss jeder andere, der meine Änderung rückgängig macht, rm -rf $path_to_submodule rm -rf .git /modules /$path_to_submodule ausführen, um den Submodul-Cache zu entfernen?
      2015-04-24 15: 09: 16Z
    2. Ich empfehle, git submodule update zu aktualisieren. Und wenn die Pfade der Submodule nicht korrekt aktualisiert wurden (Git löst einen Fehler aus), entfernen Sie sie: rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
      29.04.2015 00: 22: 40Z

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

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

    FWIW habe ich auch den .git-Ordner entfernt, bevor ich den git add ausgeführt habe.

        
    38
    2016-04-21 11: 36: 34Z
    1. genau mein Fall
      2017-05-21 09: 28: 37Z

    Ich fand, dass deinit gut für mich funktioniert:

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

    Aus Git-Dokumenten :

      

    deinit

         

    Heben Sie die Registrierung der angegebenen Submodule auf, d. h. entfernen Sie die gesamte submodule.$name   Abschnitt aus .git /config zusammen mit ihrem Arbeitsbaum.

        
    24
    2017-02-09 01: 53: 37Z
    1. Ich habe die gleiche Lösung gefunden. Dies ist heute der beste Weg im Jahr 2018)
      2018-01-11 09: 18: 31Z
    2. .git /modules /.. wurde nicht entfernt. Sie sollten sie entfernen, siehe die Antwort von @fvgs
      2018-10-01 13: 40: 14Z

    Nachdem ich mit den verschiedenen Antworten auf dieser Website 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 wiederhergestellt, den Sie vor dem Hinzufügen des Submoduls hatten. 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
    

    So haben Sie eine saubere Kasse, an der Sie keine Änderungen vornehmen müssen.

    Dies wurde getestet mit:

     
    $ git --version
    git version 1.9.3 (Apple Git-50)
    
        
    21
    2015-01-21 09: 43: 01Z
    1. Warum verwenden Sie git rm --cached $path und dann rm -rf $path anstelle von git rm -r $path?
      2014-11-29 15: 00: 12Z

    Was ich gerade mache Dezember 2012 (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}"
    
        
    17
    2012-12-18 22: 50: 23Z

    Ich habe Folgendes 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 relevanten 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 den .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
    
        
    14
    2016-04-21 11: 37: 22Z
    1. Vielen Dank dafür. Für mich musste ich die Reihenfolge der ersten drei Schritte zu 3), 1), 2) ändern. Durch Ausführen von 1) wurde zuerst fatal: no submodule mapping found in .gitmodules for path 'submodule_name' in Schritt 3 erhalten. Beide Schritte waren jedoch notwendig. (Git v2.8.2)
      2016-08-25 00: 16: 40Z

    Ich habe kürzlich ein Git-Projekt entdeckt, das viele nützliche Git-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 Submodul-Verzeichnis wird aus Ihrem Repo entfernt und existiert weiterhin in Ihrem Dateisystem. Sie können die Änderung dann wie folgt festschreiben: git commit -am "Remove the submodule".

        
    13
    2016-04-21 11: 36: 59Z

    Ich musste die Schritte von John Douthat einen Schritt weiter gehen und cd in das Verzeichnis des Submoduls eintragen und dann das Git-Repository entfernen:

     
    cd submodule
    rm -fr .git
    

    Dann könnte ich die Dateien als Teil des übergeordneten Git-Repositorys ohne die alte Referenz übergebeneines Submoduls.

        
    10
    2013-03-09 11: 42: 42Z
    1. Ich musste dies auch tun, um einen "fatal: Not a git repository:" - Fehler beim Ausführen des git rm --cache-Schritts zu umgehen.
      2013-04-01 15: 48: 00Z

    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 "..."
    

    Theoretisch sollte sich git rm in Schritt 1 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 in .git/modules/ zu entfernen. Andernfalls können Sie z. Fügen Sie das Submodul in Zukunft wieder hinzu.

    Wahrscheinlich können Sie mit den beiden oben genannten Schritten für git 1.8.5+ durchkommen, wie Sie bereits festgestellt haben git submodule-Befehle scheinen zu funktionieren.

    In Schritt 3 wird der Abschnitt für the_submodule in der Datei .git/config entfernt. Dies sollte der Vollständigkeit halber erfolgen. (Der Eintrag kann bei älteren Git-Versionen zu Problemen führen, ich muss jedoch keine testen.)

    In den meisten Antworten wird die Verwendung von git submodule deinit empfohlen. Ich finde es eindeutiger und weniger verwirrend, git config -f .git/config --remove-section zu verwenden. Laut der Dokumentation zum Git-Submodul , git deinit:

      

    Heben Sie die Registrierung der angegebenen Submodule auf ... Wenn Sie a wirklich entfernen möchten   Submodul aus dem Repository und Commit mit git-rm [1]    stattdessen .

    Zu guter Letzt: Wenn Sie git commit nicht verwenden, wird /wird möglicherweise eine Fehlermeldung angezeigt, wenn Sie git submodule summary (ab Version 2.7) ausführen:

     
    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.

        
    8
    2017-07-01 18: 05: 06Z
     
    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
    
        
    7
    2015-04-18 04: 38: 27Z

    Ich habe gerade die versteckte Datei .submodule (vergessener genauer Name) gefunden, sie enthält eine Liste ... Sie können sie auf diese Weise einzeln löschen. Ich hatte gerade einen, also habe ich ihn gelöscht. Einfach, aber es könnte Git durcheinander bringen, da ich nicht weiß, ob etwas an das Submodul angeschlossen ist. Scheint soweit in Ordnung, abgesehen von Libetpans üblichem Upgrade-Problem, aber das hat (hoffentlich) nichts damit zu tun.

    Es wurde bemerkt, dass niemand manuelles Löschen gepostet hat.

        
    7
    2016-04-21 11: 37: 13Z
    1. Es ist .gitmodules
      2019-02-09 09: 51: 31Z

    Wenn Sie das Submodul gerade hinzugefügt haben und beispielsweise einfach das falsche Submodul hinzugefügt haben oder es an der falschen Stelle hinzugefügt haben, führen Sie einfach git stash aus, und löschen Sie dann den Ordner. Dies setzt voraus, dass Sie im letzten Repo nur das Submodul hinzugefügt haben.

        
    4
    2016-06-01 08: 35: 20Z

    Ab Version 2.17 gilt Folgendes:

     
    git submodule deinit -f {module_name}
    git add {module_name}
    git commit
    
        
    2
    2019-04-12 14: 07: 19Z

    Ich habe ein Bash-Skript für e erstelltase den Entfernungsprozess. Es wird auch geprüft, ob es Änderungen im Repo gibt, die nicht gespeichert wurden, und um Bestätigung gebeten. Es wurde unter os x getestet. Es wäre interessant zu wissen, ob es auch unter normalen Linux-Distributionen funktioniert:

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

    1
    2019-05-22 15: 53: 38Z

    In der neuesten Version von Git sind nur 4 Vorgänge 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>
    • Bestätigen Sie git commit -m "Removed submodule xxx"
    0
    2019-03-01 14: 48: 24Z
Quelle platziert Hier