Detaillierte Lösung
In der Anmerkung am Ende dieser Antwort (letzter Absatz) finden Sie eine schnelle Alternative zu Git-Submodulen mit npm;)
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:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
In den folgenden Schritten werde ich dies someLib
als bezeichnen <directory 1>
.
Am Ende werden wir so etwas haben:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
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.
git clone <git repository A url>
cd <git repository A directory>
Schritt 2
Der aktuelle Ordner ist das neue Repository. Entfernen Sie daher die aktuelle Fernbedienung.
git remote rm origin
Schritt 3
Extrahieren Sie den Verlauf des gewünschten Ordners und schreiben Sie ihn fest
git filter-branch --subdirectory-filter <directory 1> -- --all
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!
git remote add origin <git repository B url>
git push
Möglicherweise müssen Sie den upstream
Zweig für Ihren ersten Push festlegen
git push --set-upstream origin master
Sauber <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
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Ersetzen Sie <directory 1>
durch den Ordner, den Sie entfernen möchten. -r
wird es rekursiv innerhalb des angegebenen Verzeichnisses tun :). Jetzt drücke origin/master
mit--force
git push origin master --force
Boss Stage (siehe Hinweis unten)
Erstellen Sie ein Submodul von <git repository B>
in<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Überprüfen Sie, ob alles wie erwartet funktioniert hat und push
git push origin master
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 :
- Verschieben Sie den Ordner in ein neues Repository
- Führen Sie
npm init
beide Repositorys aus
- Führen
npm install --save git://github.com/user/project.git#commit-ish
Sie dort aus, wo Ihre Abhängigkeiten installiert werden sollen