Wie entferne ich ein Git-Submodul?
Gibt es übrigens einen Grund, den ich nicht einfach tun kann
git submodule rm whatever
?
git
git-submodules
R. Martinho Fernandes
quelle
quelle
git rm modulename
undrm -rf .git/modules/modulename
.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/1562138Antworten:
Seit git1.8.3 (22. April 2013) :
Der Löschvorgang wird ebenfalls verwendet
git rm
(seit git1.8.5 Oktober 2013).Zusammenfassung
Der 3-stufige Entfernungsprozess wäre dann:
Erläuterung
rm -rf
: Die in Rede ist Daniel Schroeder ‚s Antwort , und durch zusammengefasst Eonil in den Kommentaren :git rm
: Siehe Commit 95c16418 :git submodule deinit
: Es stammt aus diesem Patch :Dies ist wichtig, wenn die (De-) Initialisierungsschritte (
.git/config
und.git/modules/xxx
)Seit git1.8.5
git rm
kümmert sich das auch um:add
' Schritt, der die URL eines Submoduls in der.gitmodules
Datei aufzeichnet : Es muss für Sie entfernt werden.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:
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)quelle
submodule deinit
?.gitmodules
sollte in Ordnung sein, aber ich würde immer noch alles mit dem.git
Verzeichnis überprüfen (dh die lokale Konfiguration in Ihrem lokalen Repo: das ist nicht geändert durch agit pull
).gitmodules
Eintrags 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.git rm submodule
genau das, was Sie wollen, wie andere bereits gesagt haben.Über die Seite Git Submodule Tutorial :
Um ein Submodul zu entfernen, müssen Sie:
.gitmodules
Datei..gitmodules
Änderungen in Szene:git add .gitmodules
.git/config
.git rm --cached path_to_submodule
(kein abschließender Schrägstrich)..git
Verzeichnis des Submoduls :rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
Siehe auch : alternative Schritte unten .
quelle
git submodule rm
einfach 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.Nur eine Notiz. Seit Git 1.8.5.2 reichen zwei Befehle aus:
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 rm
größten Teil der Arbeit auf einem Submodul.--Update (07/05/2017) -
Zur Verdeutlichung
the_submodule
ist der relative Pfad des Submoduls innerhalb des Projekts. Zum Beispiel,subdir/my_submodule
wenn sich das Submodul in einem Unterverzeichnis befindetsubdir
.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:quelle
.git/config
. Unter stackoverflow.com/a/36593218/1562138 finden Sie die vollständige Methode zum Entfernen eines Submoduls.git init && git submodule add <repository> && git rm <name>
hinterlässt den.git/config
Eintrag und das.git/modules/<name>
Verzeichnis und seinen Inhalt. Vielleicht haben Sie das Submodul vor dem Entfernen nicht initialisiert?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:
quelle
Einfache Schritte
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
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 habengit 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:
Es ist eine gute Idee,
git rebase HEAD
zuerst 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? .
quelle
for dir in directory/*; do git rm --cached $dir; done
.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
git submodule | grep '^+' | cut -d' ' -f2
submodulename
in doppelte Anführungszeichen setzen"submodulename"
.. unter Bezugnahme auf die.git/config
DateiZusätzlich zu den Empfehlungen musste ich
rm -Rf .git/modules/path/to/submodule
in der Lage sein, ein neues Submodul mit demselben Namen hinzuzufügen (in meinem Fall ersetzte ich eine Gabel durch das Original).quelle
So entfernen Sie ein hinzugefügtes Submodul mit:
Lauf:
Das ist es.
Für alte Versionen von git (ca. 1.8.5) verwenden Sie:
quelle
git rm
lässt immer noch Sachen drin.git/modules/
. (2.5.4)git rm
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 Plattformkombination gefunden haben / Version, in der dies nicht passiert, sollten Sie wahrscheinlich einen Fehler melden.git rm
Sachen in Verzeichnis.git/modules/
und.git/config
Datei (Ubuntu, Git 2.7.4). Andere Antwort funktioniert 100%: stackoverflow.com/a/36593218/4973698Sie müssen den Eintrag in
.gitmodules
und.git/config
entfernen und das Verzeichnis des Moduls aus dem Verlauf entfernen:Wenn Sie auf die Mailingliste von git schreiben, wird wahrscheinlich jemand ein Shell-Skript für Sie erstellen.
quelle
Sie können einen Alias verwenden, um die von anderen bereitgestellten Lösungen zu automatisieren:
Fügen Sie das in Ihre Git-Konfiguration ein, und dann können Sie Folgendes tun:
git rms path/to/submodule
quelle
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.git
Aliase sollten an einer beliebigen Stelle im Arbeitsbaum funktionieren (oder ordnungsgemäß fehlschlagen). DRITTES:git config -f .git/config
schlägt innerhalb von Submodulen fehl, da.git
normalerweise eine Datei vorhanden ist.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 den Verlust von Informationen zu vermeiden).
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
quelle
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
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.gitmodules
Datei bearbeiten oder irgendetwas darin.git/config
. In diesem Fall brauchen Sie nur:FWIW , ich habe auch den
.git
Ordner entfernt, bevor ich das gemacht habegit add
.quelle
Ich fand
deinit
Werke gut für mich:Aus Git-Dokumenten :
quelle
git
s , die von wissendeinit
, wie die anderen Antwort , die entfernt.git/modules/submodule
zu früh Verzeichnis, das neuere zu machen scheintgit
s jetzt scheitern oder dann. Auch (siehe meinen Kommentar dort) ist das Entfernen.git/modules/submodule
möglicherweise der falsche Pfad. Dies ist also ein gefährlicher Schritt, der am besten erst später ausgeführt wird,git
wenn Sie sich beschweren (oder wenn Sie zu 299% sicher sind, dass dies der richtige Pfad ist und wirklich benötigt wird).git commit
inszenierte Änderungen im Arbeitsverzeichnis vornehmen:modified .gitmodules
unddeleted <submodule-path>
.Nachdem ich mit all den verschiedenen Antworten auf dieser Site experimentiert hatte, kam ich zu folgender Lösung:
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.
Dadurch haben Sie eine saubere Kaufabwicklung, ohne dass Änderungen vorgenommen werden müssen.
Dies wurde getestet mit:
quelle
git rm --cached $path
dannrm -rf $path
stattgit rm -r $path
?git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'
-> Wenn Sie versuchen, 'gefährliches .. Submodul' mit Ihrem Skript zu entfernen, ist diesrm -rf ..
wahrscheinlich nicht das, was Sie wollen ..Was ich gerade im Dezember 2012 mache (kombiniert die meisten dieser Antworten):
quelle
Folgendes habe ich getan:
1.) Löschen Sie den entsprechenden Abschnitt aus der .gitmodules-Datei. Sie können den folgenden Befehl verwenden:
2.) Führen Sie die
.gitmodules
Änderungen durch3.) Löschen Sie den entsprechenden Abschnitt aus
.git/config
. Sie können den folgenden Befehl verwenden:4.) Entfernen Sie den Gitlink (kein abschließender Schrägstrich):
5.) Bereinigen Sie die
.git/modules
:6.) Festschreiben:
7.) Löschen Sie die jetzt nicht verfolgten Submodul-Dateien
quelle
fatal: no submodule mapping found in .gitmodules for path 'submodule_name'
in Schritt 3. Beide Schritte waren jedoch notwendig. (Git v2.8.2)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:
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"
.quelle
git delete-submodule
, wiegit-extras
Bedü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 . IEgit-delete-submodule
entfernt 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-extras
könnte zu 99% hilfreich sein, aber bitte beschweren Sie sich nicht, wenn bei der Verwendung etwas völlig schief geht. DU WURDEST GEWARNT!Ich musste John Douthats Schritte einen Schritt weiter und
cd
in das Verzeichnis des Submoduls gehen und dann das Git-Repository entfernen:Dann könnte ich die Dateien als Teil des übergeordneten Git-Repositorys ohne den alten Verweis auf ein Submodul festschreiben.
quelle
git rm --cache
Schritt auszuführen.Hier sind die 4 Schritte, die ich für notwendig oder nützlich hielt (wichtige zuerst):
In der Theorie ,
git rm
in 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 alle
git submodule
Befehle zu funktionieren scheinen.Schritt 3 entfernt den Abschnitt für
the_submodule
in 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 benutzengit config -f .git/config --remove-section
. Nach der git-Submodul Dokumentation ,git deinit
:Last but not least, wenn Sie dies nicht tun
git commit
, werden / können Sie dabei einen Fehler erhaltengit submodule summary
(ab Git 2.7):Dies ist unabhängig davon, ob Sie die Schritte 2 oder 3 ausführen.
quelle
quelle
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
quelle
.gitmodules
Mit Git 2.17 und höher ist es nur:
quelle
git 2.17.1
nochgit 2.20.1
. Allerdings verwendetgit rm
stattgit add
für beide gearbeitet. Anmerkungen: Wird-f
nicht benötigt, wenn die Dinge sauber sind. Achten Sie darauf, nie Optionen zu verwenden , mit ,git
wenn 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, dagit
die richtige (!) Hilfe zum Drucken gedruckt wird, wenn etwas aufgrund dessen blockiert ist.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 stash
löschen Sie einfach den Ordner. Dies setzt voraus, dass das Hinzufügen des Submoduls das einzige ist, was Sie im letzten Repo getan haben.quelle
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
git
Versionen2.17
und höher , um ein Submodul zu entfernen :2.20.1
und 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"$submodule"
einen ordnungsgemäß angegebenen Pfad zum Submodul durch die Windows-Methode. (Ich bin nicht Windows)Beachten Sie, dass
ist die direkte Umkehrung zu
aber
ist auch ganz umgekehrt
weil einige Befehle im Grunde mehr als nur eine einzige Sache tun müssen:
git submodule deinit -- module
.git/config
git rm
.gitmodules
git submodule add
.git/modules/NAME/
git submodule init
, also Updates.git/config
git submodule update
checkt das Modul also nicht rekursiv aus.gitmodules
git submodule update --init --recursive -- module
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
git
einfach das Offensichtliche und macht das richtig und versucht nicht einmal mehr zu tun.git
ist 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
git
das 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:
git
ist zu alt. Dann verwenden Sie eine neueregit
. (Siehe unten, wie es geht.)git clean
Sinne nicht sauber . Reinigen Sie dann zuerst Ihr Submodul mit diesem Befehl. (Siehe unten.)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.)git
Power-User).Mögliche Korrekturen folgen.
Verwenden Sie eine neuere
git
Wenn Ihre Maschine zu alt ist, ist keine
submodule deinit
in Ihrergit
. Wenn Sie Ihre nicht aktualisieren möchten (oder können), verwenden Siegit
einfach eine andere Maschine mit einer neuerengit
!git
soll vollständig verteilt sein, sodass Sie einen anderen verwenden könnengit
, 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
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
git status
es wieder sauber ist. Sie können dies tun, weil Sie es dank des ersten Schritts schon einmal sauber hatten.Dies
othermachine
kann eine VM oder eine Ubuntu-WSL unter Windows sein. Sogar achroot
(aber ich gehe davon aus, dass Sie kein Root sind, denn wenn Sie es sindroot
, sollte es einfacher sein, auf das neuere zu aktualisierengit
).Beachten Sie
ssh
, dass es zahlreiche Möglichkeiten zum Transport vongit
Repositorys gibt , wenn Sie nicht einsteigen können . Sie können Ihren Arbeitsbaum auf einen USB-Stick (einschließlich des.git
Verzeichnisses) 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:Sie können diese Multiplikation verwenden, und diese wird in gespeichert
$HOME/.gitconfig
. Etwas wieschreibt URLs wie neu
in
Es ist einfach, wenn Sie sich an leistungsstarke
git
Funktionen 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.
git status
undgit clean -ixfd
dein Freund istrm
unddeinit
so lange wie möglich. Optionen (wie-f
) fürgit
sind gut, wenn Sie ein Profi sind. Aber als Sie hierher kamen, sind Sie wahrscheinlich nicht so erfahren in dersubmodule
Gegend. Also besser auf Nummer sicher gehen.Beispiel:
Sie sehen, es wird nicht
-f
benötigtsubmodule deinit
. Wenn die Dinge in gewissemgit clean
Sinne sauber sind . Beachten Sie auch, dass diesgit clean -x
nicht benötigt wird. Dies bedeutet, dassgit submodule deinit
nicht 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:
Die letzte Zeile gibt folgenden Fehler aus:
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üllenWas nun? Nun, mach genau das, was dir gesagt wurde! Verwenden
--name someunusedname
.gitmodules
dann sieht es so ausls -1p .git/modules/
gibtAuf 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.git
).Wenn Sie jedoch das zwischengespeicherte Verzeichnis entfernt haben, stoßen beide unterschiedlichen Kassen aufeinander, da Sie die
--name
Optionen 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 verwendengit 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 wiegit bisect
nahezu 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 wiegit rm $module; rm -f .git/module/$module
völlig falsch! Sie müssen entweder konsultierenmodule/.git
oder.gitmodules
das Richtige zum Entfernen finden!So fallen nicht nur die meisten anderen Antworten in diese gefährliche Falle, auch sehr beliebte
git
Erweiterungen 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!Zu Ihrer Information, Sie haben es wahrscheinlich erraten: hilbix ist mein GitHub-Account.
quelle
Zusammenfassend sollten Sie Folgendes tun:
Setze path_to_submodule var (kein abschließender Schrägstrich):
Löschen Sie die entsprechende Zeile aus der .gitmodules-Datei:
Löschen Sie den entsprechenden Abschnitt aus .git / config
Heben Sie die Bühne auf und entfernen Sie $ path_to_submodule nur aus dem Index (um zu verhindern, dass Informationen verloren gehen).
Verfolgen Sie Änderungen an .gitmodules
Übernehmen Sie das Superprojekt
Löschen Sie die jetzt nicht verfolgten Submodul-Dateien
Siehe auch: Alternative Richtlinien
quelle
git rm --cached $path_to_submodule
undgit add .gitmodules
nein? Beim ersten Befehl ist ein Fehlerfatal: Please stage your changes to .gitmodules or stash them to proceed
aufgetreten : Ich hatte nicht bereitgestellte Änderungen an.gitmodules
. Dasgit add .gitmodules
erste zu lösen löst das.Das ist einfach:
.gitmodules
git add .gitmodules
git submodule deinit <path to submodule>
git rm <path to submodule>
Sie müssen die Moduldateien in Ihrem Projekt manuell löschen.
quelle
git submodule deinit <submodule_name>
undgit rm <path_to_submodule>
. Der letzte Befehl löscht automatisch den Eintrag in der.gitmodules
. Git 2.17Ich 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 x
wäre interessant zu wissen, ob es auch unter gängigen Linux-Distributionen funktioniert:https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
quelle
In der neuesten Version von Git sind nur 4 Operationen erforderlich, um das Git-Submodul zu entfernen.
.gitmodules
git add .gitmodules
git rm --cached <path_to_submodule>
git commit -m "Removed submodule xxx"
quelle
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
$HOME
Verzeichnis mit dem Namenremove_submodule.sh
:quelle
git rm <submodule path> && git commit
. Dies kann mit rückgängig gemacht werdengit revert
..gitmodules
Datei sind.$GIT_DIR/modules/<name>/
.Quelle:
git help submodules
quelle
Git-Submodul entfernen
Um ein
git
Submodul zu entfernen, sind weniger als 4 Schritte erforderlich..gitmodules
Datei. Der Eintrag könnte wie unten erwähnt seingit add .gitmodules
git rm --cached <path_to_submodule>
.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.
.git/config
Datei. Der Eintrag könnte wie unten erwähnt seinrm -rf .git/modules/path_to_submodule
Diese 5. und 6. Schritte erzeugen keine Änderungen, die festgeschrieben werden müssen.
quelle
git submodule deinit
git-scm.com/docs/git-submodule#Documentation/…