Ich gehe von der Annahme aus, dass ein Single-Branch Repo kleiner wäre. Dies entspricht meiner Erfahrung, aber angesichts der Handhabung von Pack-Dateien kann ich nicht mit hundertprozentiger Sicherheit sagen, dass dies immer funktionieren wird. Im schlimmsten Fall könnte man die "Bereinigungsprozedur" gegen Ende von Option 2 regelmäßig ausführen, um sicherzustellen, dass das lokale Minimum minimal ist.
Das heißt ...
Wenn Sie direkten Zugang zu einem Repo haben (das heißt mit ihm als lokales Repository interagieren kann), dann können Sie tun, was Sie gefragt haben. Aber meiner Meinung nach ist es einfacher neu zu klonen. Ich nehme an, Sie wollen nicht erneut klonen, weil Sie die Arbeitskopie - auch nur kurzzeitig - nicht aus der Produktion entfernen wollen. Wenn das der Fall ist, gibt es eine Möglichkeit, es zu umgehen. Aber für den Fall, dass es einen anderen Grund gibt, nicht erneut zu klonen, werde ich auch einen anderen Ansatz formulieren.
Option 1 - re-Klon, während der Arbeits Baum Erhaltung
Im Grunde, was hier zu tun ist, nur eine neue, separate Klon erstellen, und dann tauschen Sie den .git/
Ordner über zum alten Repo. Ich rate generell nicht, manuell mit dem Ordner .git/
zu mischen; Das ist also die Kehrseite dieses Ansatzes, und wir müssen vorsichtig sein.
cd /path/to/old/repo
mv .git ../backup.of.old.repo.git
cd ..
git clone --single-branch --branch master url/of/origin new.repo
mv new.repo/.git repo
Dann git status
überprüfen, tun, was andere Validierungen Sinn machen, stellen Sie sicher, alles ist vor dem Wegwerfen backup.of.old.repo.git
wie erwartet funktioniert.
Option 2 - Änderung bestehende Repo-Konfiguration
Die Hauptsache ist, dass --single-branch
tut, ist die holen Regeln für die Remote zu ändern. Sie können
git config remote.origin.fetch +refs/heads/master:refs/remotes/origin/master
Aber Ihr Repo immer noch, dass leicht genug tun hat alle anderen Zweige (weil, wie es erstellt wurde); es wird einfach nicht in Zukunft nach ihnen suchen. Das Ausräumen der vorhandenen Objekte ist der schwierigere Teil.
Aufräumverfahren:
Also zuerst müssen Sie alle unerwünschten Refs loszuwerden. Sie könnten dies mit roher Gewalt tun (entfernen Sie Einträge von .git/packed-refs
, löschen Sie Dateien von .git/refs/
), aber seien Sie vorsichtig, wenn Sie dies tun. Oder Sie können git branch --delete
, git tag --delete
usw. verwenden, um zu überprüfen, ob alle mit etwas wie git for-each-ref
verschwunden sind.
Aber nur weil alle refs weg sind, bedeutet das nicht, dass nichts die unerwünschten Commits erreichen kann. Sie müssen auch den Reflog aufheben. Dafür gibt es Git-Befehle, aber ich hatte nie viel Glück, sie dazu zu bringen, das zu tun, was ich will. Wenn Sie wissen, dass die lokalen Reflogs für nichts anderes benötigt werden, können Sie rm -r .git/logs
.
Aber nur weil nichts die unerwünschten Commits erreichen kann, bedeutet das nicht, dass sie weg sind. Jetzt müssen Sie git gc --aggressive --prune=now
Und das sollte schließlich die Größe des Repo reduzieren, vorausgesetzt, die anderen Zweige für viel des Raumes wurden Buchhaltung ...