Der einfache Weg ™
Es stellt sich heraus, dass dies eine so verbreitete und nützliche Praxis ist, dass die Overlords von Git es wirklich einfach gemacht haben, aber Sie müssen eine neuere Version von Git haben (> = 1.7.11 Mai 2012). Im Anhang erfahren Sie, wie Sie das neueste Git installieren. Außerdem finden Sie in der folgenden exemplarischen Vorgehensweise ein Beispiel aus der Praxis .
Bereiten Sie das alte Repo vor
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
Hinweis: <name-of-folder>
darf KEINE führenden oder nachfolgenden Zeichen enthalten. Beispielsweise muss der Ordner mit dem Namen subproject
MUSS als subproject
NICHT übergeben werden./subproject/
Hinweis für Windows-Benutzer: Wenn Ihre Ordnertiefe> 1 ist, <name-of-folder>
muss ein Ordnertrennzeichen (/) im * nix-Stil vorhanden sein. Beispielsweise muss der Ordner mit dem Namen path1\path2\subproject
MUSS als übergeben werdenpath1/path2/subproject
Erstellen Sie das neue Repo
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
Verknüpfe das neue Repo mit GitHub oder wo auch immer
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
Aufräumen innen <big-repo>
, wenn gewünscht
git rm -rf <name-of-folder>
Hinweis : Dadurch bleiben alle historischen Referenzen im Repository Lesen Sie Anhang, wenn Sie tatsächlich Bedenken haben, ein Kennwort festgeschrieben zu haben, oder wenn Sie die Dateigröße Ihres .git
Ordners verringern müssen .
...
Exemplarische Vorgehensweise
Dies sind die gleichen Schritte wie oben , aber befolgen Sie meine genauen Schritte für mein Repository, anstatt sie zu verwenden<meta-named-things>
.
Hier ist ein Projekt zur Implementierung von JavaScript-Browsermodulen in Node:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Ich möchte einen einzelnen Ordner btoa
in ein separates Git-Repository aufteilen
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
Ich habe jetzt einen neuen Zweig, für den btoa-only
nur Commits vorhanden sind, btoa
und ich möchte ein neues Repository erstellen.
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
Als nächstes erstelle ich ein neues Repo auf GitHub oder Bitbucket oder was auch immer und füge es als das hinzu origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
Glücklicher Tag!
Hinweis: Wenn Sie ein Repo mit einem erstellt README.md
, .gitignore
und LICENSE
, müssen Sie zuerst ziehen:
git pull origin master
git push origin master
Zuletzt möchte ich den Ordner aus dem größeren Repo entfernen
git rm -rf btoa
...
Blinddarm
Neueste Git unter macOS
So erhalten Sie die neueste Version von Git mit Homebrew :
brew install git
Neueste Git auf Ubuntu
sudo apt-get update
sudo apt-get install git
git --version
Wenn das nicht funktioniert (Sie haben eine sehr alte Version von Ubuntu), versuchen Sie es
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Wenn das immer noch nicht funktioniert, versuchen Sie es
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
Danke an rui.araujo aus den Kommentaren.
Löschen Sie Ihre Geschichte
Durch das Entfernen von Dateien aus Git werden diese standardmäßig nicht entfernt, sondern nur festgeschrieben, dass sie nicht mehr vorhanden sind. Wenn Sie die historischen Referenzen tatsächlich entfernen möchten (dh Sie haben ein Kennwort festgeschrieben), müssen Sie Folgendes tun:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
Danach können Sie überprüfen, ob Ihre Datei oder Ihr Ordner überhaupt nicht mehr im Git-Verlauf angezeigt wird
git log -- <name-of-folder> # should show nothing
Sie können jedoch keine Löschvorgänge auf GitHub und dergleichen "pushen" . Wenn Sie es versuchen, erhalten Sie eine Fehlermeldung und müssen dies tun, git pull
bevor Sie könnengit push
tun - und dann haben Sie wieder alles in Ihrer Geschichte.
Wenn Sie also den Verlauf aus dem "Ursprung" löschen möchten, dh aus GitHub, Bitbucket usw. löschen möchten, müssen Sie das Repo löschen und eine beschnittene Kopie des Repos erneut senden. Aber warte - es gibt noch mehr ! - Wenn Sie wirklich Bedenken haben, ein Passwort oder ähnliches loszuwerden, müssen Sie das Backup beschneiden (siehe unten).
Herstellung .git
kleiner
Der oben erwähnte Befehl zum Löschen des Verlaufs hinterlässt immer noch eine Reihe von Sicherungsdateien - weil Git Ihnen nur allzu freundlich hilft, Ihr Repo nicht versehentlich zu ruinieren. Im Laufe der Tage und Monate werden verwaiste Dateien gelöscht, aber sie bleiben für eine Weile dort, falls Sie feststellen, dass Sie versehentlich etwas gelöscht haben, das Sie nicht wollten.
Wenn Sie also den Papierkorb wirklich leeren möchten, um die Klongröße eines Repos sofort zu verringern , müssen Sie all diese wirklich seltsamen Dinge tun:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
Trotzdem würde ich empfehlen, diese Schritte nur auszuführen, wenn Sie wissen, dass Sie dies tun müssen - nur für den Fall, dass Sie das falsche Unterverzeichnis beschnitten haben, wissen Sie? Die Sicherungsdateien sollten nicht geklont werden, wenn Sie das Repo pushen. Sie befinden sich nur in Ihrer lokalen Kopie.
Anerkennung
git filter-branch
siehe meine Antwort unten.