Wie entferne ich das Submodul eines Git-Submoduls (bringe den gesamten Code zurück in den Kern)?
Wie in "sollte" ich, wie in "Best Procedure" ...
git
git-submodules
Quickredfox
quelle
quelle
git submodule deinit
, siehe meine Antwort untengit submodule deinit asubmodule ; git rm asubmodule
ausreichend, wie in meiner Antwort unten dargestelltAntworten:
Wenn Sie lediglich Ihren Submodul-Code in das Haupt-Repository einfügen möchten, müssen Sie nur das Submodul entfernen und die Dateien erneut zum Haupt-Repository hinzufügen:
Wenn Sie auch den Verlauf des Submoduls beibehalten möchten, können Sie einen kleinen Trick ausführen: Das Submodul wird in das Haupt-Repository "zusammengeführt", sodass das Ergebnis das gleiche wie zuvor ist, außer dass sich die Submodul-Dateien jetzt im befinden Haupt-Repository.
Im Hauptmodul müssen Sie Folgendes tun:
Das resultierende Repository sieht etwas seltsam aus: Es wird mehr als ein erstes Commit geben. Aber es wird keine Probleme für Git verursachen.
In dieser zweiten Lösung haben Sie den großen Vorteil, dass Sie weiterhin Git-Tadel oder Git-Log für die Dateien ausführen können, die ursprünglich in Submodulen enthalten waren. Tatsächlich haben Sie hier viele Dateien in einem Repository umbenannt, und Git sollte dies automatisch erkennen. Wenn Sie immer noch Probleme mit dem Git-Protokoll haben, versuchen Sie einige Optionen (--follow, -M, -C), die eine bessere Umbenennungs- / Kopiererkennung ermöglichen.
quelle
git merge
sicher, dass für jede Datei (auf einer der beiden "Seiten" der Zusammenführung) ein "vorheriges Festschreiben" erfolgt.mkdir foo && git mv !(foo) foo && git commit
.--allow-unrelated-histories
, um die Zusammenführung bei der gefälschten Zusammenführung zu erzwingen, wie ich es bekamfatal: refusing to merge unrelated histories
, mehr hier: github.com/git/git/blob/master/Documentation/RelNotes/…Seit git 1.8.5 (Nov 2013 ) ( ohne die Geschichte des Submoduls zu behalten ):
Das wird:
deinit
mv
.gitmodules
für dich auf (rm
),rm
).Sobald das Entfernen des Submoduls abgeschlossen ist (
deinit
undgit rm
), können Sie den Ordner wieder in seinen ursprünglichen Namen umbenennen und ihn als regulären Ordner zum Git-Repo hinzufügen.Hinweis: Wenn das Submodul von einem alten Git (<1.8) erstellt wurde, müssen Sie möglicherweise den verschachtelten
.git
Ordner im Submodul selbst entfernen , wie von Simon East kommentiertWenn Sie den Verlauf des Submoduls beibehalten müssen , lesen Sie die Antwort von jsears , die verwendet wird
git filter-branch
.quelle
deinit
allein hat den Arbeitsbaum von deinem Submodul gereinigt?Ich habe ein Skript erstellt, das ein Submodul in ein einfaches Verzeichnis übersetzt und dabei den gesamten Dateiversionsverlauf beibehält. Es leidet nicht unter den
git log --follow <file>
Problemen, unter denen die anderen Lösungen leiden. Es ist auch ein sehr einfacher einzeiliger Aufruf, der die ganze Arbeit für Sie erledigt. Glück.Es baut auf der hervorragenden Arbeit von Lucas Jenß auf, die in seinem Blogbeitrag " Integration eines Submoduls in das übergeordnete Repository " beschrieben wurde, automatisiert jedoch den gesamten Prozess und bereinigt einige andere Eckfälle.
Der neueste Code wird mit Bugfixes auf github unter gepflegt https://github.com/jeremysears/scripts/blob/master/bin/git-submodule-rewrite , aber aus Gründen des korrekten Stackoverflow-Antwortprotokolls habe ich das hinzugefügt Lösung in ihrer Gesamtheit unten.
Verwendungszweck:
git-submodule-rewrite:
quelle
curl https://raw.githubusercontent.com/jeremysears/scripts/master/bin/git-submodule-rewrite > git-submodule-rewrite.sh
und./git-submodule-rewrite.sh <submodule-name>
git rm --cached the_submodule_path
.gitmodules
Datei. Wenn dies das einzige Submodul ist, entfernen Sie die Datei.git add the_submodule_path
Einfacheren Weg habe ich noch nicht gefunden. Sie können 3-5 über den
git commit -a
Geschmack in einem Schritt komprimieren .quelle
.gitmodules
statt sein.submodules
?.gitmodules
nicht sein.submodules
.git
Verzeichnis des Submoduls entfernen, bevor ich mitgit add
dem Submodul-Ordner arbeiten konnteViele Antworten hier, aber alle scheinen zu komplex zu sein und tun wahrscheinlich nicht das, was Sie wollen. Ich bin sicher, dass die meisten Menschen ihre Geschichte behalten wollen.
In diesem Beispiel ist das Haupt-Repo
[email protected]:main/main.git
und das Submodul-Repo[email protected]:main/child.git
. Dies setzt voraus, dass sich das Submodul im Stammverzeichnis des übergeordneten Repos befindet. Passen Sie die Anweisungen nach Bedarf an.Klonen Sie zunächst das übergeordnete Repo und entfernen Sie das alte Submodul.
Jetzt werden wir die untergeordneten Repos stromaufwärts zum Haupt-Repo hinzufügen.
Im nächsten Schritt wird davon ausgegangen, dass Sie die Dateien im Zweig für die Zusammenführungsvorbereitung an denselben Speicherort verschieben möchten, an dem sich das Submodul oben befand. Sie können den Speicherort jedoch leicht ändern, indem Sie den Dateipfad ändern.
Verschieben Sie alle Ordner und Dateien mit Ausnahme des .git-Ordners in den untergeordneten Ordner.
Jetzt können Sie Ihre Dateien einfach wieder in den Hauptzweig einfügen.
Schauen Sie sich um und stellen Sie sicher, dass alles gut aussieht, bevor Sie laufen
git push
Das einzige, woran Sie sich jetzt erinnern müssen, ist, dass das Git-Protokoll standardmäßig nicht verschobenen Dateien folgt. Wenn Sie jedoch ausführen
git log --follow filename
, können Sie den vollständigen Verlauf Ihrer Dateien anzeigen.quelle
git merge merge-prep
und habe den Fehler erhaltenfatal: refusing to merge unrelated histories
. Umgehung ist dies :git merge --allow-unrelated-histories merge-prep
.child
Verzeichnis abzurufen , damit Sie sie später nicht verschieben müssen? Ich habe die gleichen Dateinamen in einem Submodul und im Haupt-Repo ... daher erhalte ich nur einen Zusammenführungskonflikt, da versucht wird, die beiden Dateien zusammenzuführen.Es ist uns passiert, dass wir 2 Repositorys für 2 Projekte erstellt haben, die so gekoppelt waren, dass es keinen Sinn machte, sie zu trennen, also haben wir sie zusammengeführt.
Ich werde zuerst zeigen, wie die Hauptzweige in jedem Zweig zusammengeführt werden, und dann erkläre ich, wie Sie dies auf alle Zweige ausweiten können, die Sie haben. Ich hoffe, es hilft Ihnen.
Wenn Sie das Submodul zum Laufen gebracht haben und es in ein vorhandenes Verzeichnis konvertieren möchten, haben Sie folgende Möglichkeiten:
Hier machen wir einen sauberen Klon, um zu arbeiten. Für diesen Prozess müssen Sie die Submodule nicht initialisieren oder aktualisieren. Überspringen Sie sie einfach.
Bearbeiten Sie
.gitmodules
mit Ihrem bevorzugten Editor (oder Vim), um das Submodul zu entfernen, das Sie ersetzen möchten. Die Linien, die Sie entfernen müssen, sollten ungefähr so aussehen:Nach dem Speichern der Datei,
Hier entfernen wir die Submodul-Beziehung vollständig, damit wir das andere Repo an Ort und Stelle zum Projekt bringen können.
Hier holen wir das Submodul-Repository zum Zusammenführen.
Hier starten wir einen Zusammenführungsvorgang der beiden Repositorys, stoppen jedoch vor dem Festschreiben.
Hier senden wir den Inhalt des Masters im Submodul an das Verzeichnis, in dem er sich befand, bevor ein Verzeichnisname vorangestellt wurde
Hier schließen wir den Vorgang ab, indem wir die Änderungen in der Zusammenführung festschreiben.
Nachdem Sie dies abgeschlossen haben, können Sie einen Push ausführen und erneut mit einem anderen Zweig zum Zusammenführen beginnen. Überprüfen Sie einfach den Zweig in Ihrem Repository, der die Änderungen erhält, und ändern Sie den Zweig, den Sie in die Zusammenführungs- und Lesebaumoperationen einbringen.
quelle
directory_of_submodule
git log original_path_of_file_in_submodule
den im Git-Repo registrierten Pfad für die Datei (die im Dateisystem nicht mehr vorhanden ist) durchführte, obwohl die Submodul-Datei lebt jetzt beisubmodule_path/new_path_of_file
Die beste Antwort darauf, die ich gefunden habe, ist hier:
http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html
Dieser Artikel erklärt die Vorgehensweise sehr gut.
quelle
Hier ist eine leicht verbesserte Version (IMHO) von @ gyims Antwort. Er nimmt eine Reihe gefährlicher Änderungen an der Hauptarbeitskopie vor, bei denen es meiner Meinung nach viel einfacher ist, separate Klone zu bearbeiten und sie am Ende zusammenzuführen.
Überprüfen Sie in einem separaten Verzeichnis (um Fehler zu bereinigen und erneut zu versuchen) sowohl das Top-Repo als auch das Subrepo.
Bearbeiten Sie zuerst das Subrepo, um alle Dateien in das gewünschte Unterverzeichnis zu verschieben
Notieren Sie sich den KOPF
Entfernen Sie nun das Subrepo aus dem Haupt-Repo
Und zum Schluss einfach zusammenführen
Und fertig! Sicher und ohne Magie.
quelle
subrepo
?git merge $SUBREPO_HEAD fatal: refusing to merge unrelated histories
angezeigt : Soll ichgit merge $SUBREPO_HEAD --allow-unrelated-histories
in diesem Fall verwenden? Oder sollte es ohne funktionieren und ich habe einen Fehler gemacht?Für wann
kehrt zurück
Kontext: Ich habe
rm -r .git*
in meinen Submodul-Ordnern festgestellt, dass sie in dem Hauptprojekt, zu dem ich sie gerade hinzugefügt hatte, de-submoduliert werden mussten. Ich habe den obigen Fehler beim De-Submodulieren einiger, aber nicht aller erhalten. Wie auch immer, ich habe sie durch Laufen repariert (natürlich nach demrm -r .git*
)Beachten Sie, dass dadurch die Geschichte nicht erhalten bleibt.
quelle
Basierend auf der Antwort von VonC habe ich ein einfaches Bash-Skript erstellt, das dies tut. Das
add
am Ende muss Platzhalter verwenden, sonst wird das vorherigerm
für das Submodul selbst rückgängig gemacht . Es ist wichtig, den Inhalt des Submodulverzeichnisses hinzuzufügen und das Verzeichnis selbst nicht imadd
Befehl zu benennen .In einer Datei namens
git-integrate-submodule
:quelle
Ich fand es bequemer, (auch?) Lokale Commit-Daten aus dem Submodul abzurufen, da ich sie sonst verlieren würde. (Konnte sie nicht pushen, da ich keinen Zugriff auf diese Fernbedienung habe). Also habe ich submodule / .git als remote_origin2 hinzugefügt, es festgeschrieben und aus diesem Zweig zusammengeführt. Ich bin mir nicht sicher, ob ich die Submodul-Fernbedienung noch als Ursprung benötige, da ich mit Git noch nicht genug vertraut bin.
quelle
Folgendes fand ich am besten und am einfachsten.
Im Submodul-Repo möchten Sie von HEAD aus in das Haupt-Repo übergehen:
git checkout -b "mergeMe"
mkdir "foo/bar/myLib/"
(identischer Pfad wie dort, wo Sie die Dateien im Haupt-Repo haben möchten)git mv * "foo/bar/myLib/"
(Bewegen Sie alle in den Pfad)git commit -m "ready to merge into main"
Zurück im Haupt-Repo, nachdem das Submodul entfernt und der Pfad "foo / bar / myLib" gelöscht wurde:
git merge --allow-unrelated-histories SubmoduleOriginRemote/mergeMe
Boom geschafft
Geschichten erhalten
Keine Bange
Beachten Sie, dass dies fast identisch mit einigen anderen Antworten ist. Dies setzt jedoch voraus, dass Sie ein eigenes Submodul-Repo besitzen. Dies macht es auch einfach, zukünftige Upstream-Änderungen für das Submodul zu erhalten.
quelle