Ich habe eine Webanwendung, die andere Webanwendungen auf bestimmte Weise untersucht. Es enthält einige Web-Demos in einem demos
Ordner und eine der Demos sollte jetzt ein eigenes Repository haben. Ich möchte ein separates Repository für diese Demo-Anwendung erstellen und daraus machenUnterpaket Submodul aus dem Haupt-Repository, ohne den Commit-Verlauf zu verlieren.
Ist es möglich, den Festschreibungsverlauf aus den Dateien im Ordner eines Repositorys beizubehalten, daraus ein Repository zu erstellen und es stattdessen als Submodul zu verwenden?
git
git-submodules
revision-history
GabLeRoux
quelle
quelle
Antworten:
Detaillierte Lösung
In der folgenden Antwort erfahren Sie, wie Sie einen Ordner aus einem Repository extrahieren, ein Git-Repository daraus erstellen und ihn dann als Submodul anstelle eines Ordners einfügen.
Inspiriert von Gerg Bayers Artikel Verschieben von Dateien von einem Git-Repository in ein anderes, Bewahren der Geschichte
Am Anfang haben wir so etwas:
In den folgenden Schritten werde ich dies
someLib
als bezeichnen<directory 1>
.Am Ende werden wir so etwas haben:
Erstellen Sie ein neues Git-Repository aus einem Ordner in einem anderen Repository
Schritt 1
Holen Sie sich eine neue Kopie des Repositorys zum Teilen.
Schritt 2
Der aktuelle Ordner ist das neue Repository. Entfernen Sie daher die aktuelle Fernbedienung.
Schritt 3
Extrahieren Sie den Verlauf des gewünschten Ordners und schreiben Sie ihn fest
Sie sollten jetzt ein Git-Repository mit den Dateien aus
directory 1
dem Stammverzeichnis Ihres Repos mit dem gesamten zugehörigen Commit-Verlauf haben.Schritt 4
Erstellen Sie Ihr Online-Repository und pushen Sie Ihr neues Repository!
Möglicherweise müssen Sie den
upstream
Zweig für Ihren ersten Push festlegenSauber
<git repository A>
(optional, siehe Kommentare)Wir wollen Spuren (Dateien und begehen Geschichte) löschen von
<git repository B>
aus<git repository A>
so Geschichte für diesen Ordner nur einmal dort ist.Dies basiert auf dem Entfernen vertraulicher Daten aus Github.
Gehen Sie zu einem neuen Ordner und
Ersetzen Sie
<directory 1>
durch den Ordner, den Sie entfernen möchten.-r
wird es rekursiv innerhalb des angegebenen Verzeichnisses tun :). Jetzt drückeorigin/master
mit--force
Boss Stage (siehe Hinweis unten)
Erstellen Sie ein Submodul von
<git repository B>
in<git repository A>
Überprüfen Sie, ob alles wie erwartet funktioniert hat und
push
Hinweis
Nachdem ich das alles getan hatte, wurde mir in meinem Fall klar, dass es angemessener war, stattdessen npm zu verwenden, um meine eigenen Abhängigkeiten zu verwalten. Wir können Git-URLs und -Versionen angeben, siehe die Git-URLs package.json als Abhängigkeiten .
Wenn Sie dies auf diese Weise tun, muss das Repository, das Sie als Anforderung verwenden möchten, ein npm-Modul sein, sodass es eine
package.json
Datei enthalten muss. Andernfalls wird folgende Fehlermeldung angezeigt :Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.tldr (alternative Lösung)
Möglicherweise ist es einfacher, npm zu verwenden und Abhängigkeiten mit Git-URLs zu verwalten :
npm init
beide Repositorys ausnpm install --save git://github.com/user/project.git#commit-ish
Sie dort aus, wo Ihre Abhängigkeiten installiert werden sollenquelle
cd someLib
vor Schritt 2 tun ? Sie sagen "Der aktuelle Ordner wird das neue Repository sein", aber tatsächlich nicht. Das neue Repository (Submodul) befindet sich in diesem Ordner.refs/original/...
was in Schritt 3 erstellt wird.Die Lösung von @GabLeRoux zerquetscht die Zweige und die damit verbundenen Commits.
Eine einfache Möglichkeit, all diese zusätzlichen Zweige und Commits zu klonen und zu behalten:
1 - Stellen Sie sicher, dass Sie diesen Git-Alias haben
2 - Klonen Sie die Fernbedienung, ziehen Sie alle Zweige, wechseln Sie die Fernbedienung, filtern Sie Ihr Verzeichnis und drücken Sie
quelle
Die Lösung von GabLeRoux funktioniert gut, es sei denn, Sie verwenden
git lfs
und haben große Dateien unter dem Verzeichnis, das Sie trennen möchten. In diesem Fall bleiben nach Schritt 3 alle großen Dateien Zeigerdateien anstelle von echten Dateien. Ich denke, es liegt wahrscheinlich daran, dass die.gitattributes
Datei im Filterverzweigungsprozess entfernt wird.Als ich das erkenne, finde ich, dass die folgende Lösung für mich funktioniert:
Kopieren, mit
.gitattributes
welchem git lfs große Dateien in ein.git/
Verzeichnis verfolgt werden, um nicht gelöscht zu werden.Wenn der
.gitattributes
Filterzweig fertig ist, vergessen Sie nicht, das zurückzusetzen, wenn Sie git lfs weiterhin für das neue Repository verwenden möchten:quelle