Was ist der aktuelle Weg, um ein Git-Submodul zu entfernen?

90

Ab Git-Version 1.9.3 (Apple Git-50) auf dem Mac Wie entferne ich ein Git-Submodul? Ich lese eine Menge veralteter Informationen, und viele Entwickler sagen mir, dass sie nicht funktionieren. Was ist der aktuelle Weg? wird git deinit pathToSubModule der Trick machen?

Die Schritte, von denen ich dachte, dass sie funktionieren würden, sind hier, aber Kommentare sagen, dass sie nicht funktionieren .

Lassen Sie mich meine aktuelle Situation erklären und erklären, was ich erreichen muss. Ich habe das Quick-Repository installiert und es als Submodul zu meinem Projekt hinzugefügt. Dieser Code ist bereits eingecheckt und wird von anderen verwendet. Was ich jetzt tun müssen , ist die Gabel die gleiche Schnell Repository und Host es auf einem sichereren Github , dass meine Firma hat (so eine völlig andere private Github). Nachdem ich es gegabelt habe, möchte ich diese Gabel als gitSubmodule hinzufügen und sie das aktuelle Quick-Submodul ersetzen lassen, das ich zuvor installiert hatte.

Update: Ich habe gelesen, dass das Folgende der richtige Weg für die neueste Git-Version ist. Bitte bestätigen Sie.

To remove a submodule added using:

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

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
j2emanue
quelle
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.
Elise van Looij

Antworten:

189

Du hast die git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Heben Sie die Registrierung der angegebenen Submodule auf, dh entfernen Sie den gesamtensubmodule.$name
Abschnitt .git/configzusammen mit ihrem Arbeitsbaum.

Weitere Anrufe git submodule update, git submodule foreachund git submodule syncwird überspringen alle nicht registrierten Submodule , bis sie wieder initialisiert werden, so Sie diesen Befehl verwenden , wenn Sie nicht mehr eine lokale Kasse des Submoduls in Ihrer Arbeit Baum nicht haben wollen.

Wenn Sie wirklich ein Submodul aus dem Repository entfernen und git rmstattdessen diese Verwendung festschreiben möchten .

Wenn --forceangegeben, wird der Arbeitsbaum des Submoduls entfernt, auch wenn er lokale Änderungen enthält.

CodeWizard
quelle
8
Ich möchte das Submodul für mich und die anderen Benutzer komplett auslöschen. Alles was ich brauche ist git submodule deinit asubmodule; und git rm asubmodule ?? Was ist auch mit den zwischengespeicherten Submodulen der anderen Benutzer? Müssten sie diese nach dem Herunterziehen löschen?
j2emanue
1
Ich wollte die lokale Kopie des Submoduls löschen und das hat perfekt funktioniert, alle Dateien im Subdir sind weg.
Malhal
1
Möglicherweise benötigen rm -rf <asubmodule>Sie auch, wenn Sie bereits eine Version des Basis-Repositorys ausgecheckt haben, bei der das Submodul nicht registriert wurde.
Sarah Messer
4

Ich benutze Git Version 2.16.2 und git rmmache den Job meistens gut:

git rm path-to-submodule

Sie können mit verifizieren git statusund git diff --cacheddass diese deinitializes das Submodul und modifiziert .gitmodulesautomatisch. Wie immer müssen Sie die Änderung festschreiben.

Obwohl das Submodul aus der Quellcodeverwaltung entfernt wurde, .git/modules/path-to-submoduleenthält es dennoch das Submodul-Repository und .git/configseine URL, sodass Sie diese manuell entfernen müssen:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Das Beibehalten des Submodul-Repositorys und der Konfiguration ist beabsichtigt, damit Sie das Entfernen mit z git reset --hard.

mrts
quelle
Letzte
3

So entfernen Sie ein Submodul sicher.

(fügt zu https://stackoverflow.com/a/1260982/342794 hinzu )

  1. Listen Sie den Submodulabschnitt in der .gitmodulesDatei auf und suchen Sie ihn . Sprich über Terminal vi .gitmodules. Beispiel:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Submodule können mit lokalen Gabeln verwendet werden. Bei Projekten mit langer Laufzeit kann der Code vom ursprünglichen Repo abweichen und einige Korrekturen aufweisen. Es ist eine gute Idee zu überprüfen, ob der Submodulcode im Verlauf des Projekts Änderungen erfahren hat. Beispiel: Sehen Sie sich die Protokolle an, wenn sie auf einen masterZweig oder einen lokalen Zweig zeigen. Durchsuchen von Git-Protokollen, um Änderungen zu finden, die über das Terminal vorgenommen wurden. Normalerweise werden diese in einem Verzeichnis gespeichert, in meinem Beispiel unter submodulesVerzeichnis.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Entfernen Sie den Submodulabschnitt aus .gitmodules und speichern Sie die Datei. Beispiel: git statussollte nur folgendes als geändert anzeigen

    modified:   .gitmodules
    
  4. Stellen Sie die Änderungen mit git add .gitmodules.

  5. Listen Sie den Submodulabschnitt in .git/configDateien auf und suchen Sie ihn . Sprich über Terminal vi .git/config. Beispiel:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Entfernen Sie die Git-Cache-Sobmodule-Dateien. Laufen git rm --cached submodules/afnetworking(kein abschließender Schrägstrich) würde es erfolgreich entfernen. Beispiel:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Entfernen Sie die Submodul-Dateien unter .gitVerzeichnis mit rm -rf .git/modules/.... Bestätigen Sie es anschließend mit git status.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Übernehmen Sie die Änderungen. Bestätigen Sie anschließend mit git status.

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Löschen Sie die nicht verfolgten Submodul-Dateien.

    User$ rm -rf submodules/afnetworking
    
  10. Löschen Sie die Referenzen aus dem Xcode-Projekt. Erstellen, Beheben von Kompilierungs- und Laufzeitproblemen.

lal
quelle