2017-05-30 2 views
0

Ich habe viele Zweige von meiner Hauptentwicklung.GIT - Klon seichter machen

Ich verwende GIT-Klone auf meinem Produktionsserver. Kürzlich habe ich von --single-branch erfahren, das deutlich weniger Platz benötigt, um Git-Dateien zu schreiben. Gibt es eine Möglichkeit, vorhandene Git-Installationen in eine seichtere Version zu konvertieren (als ob ich --single-branch) hätte, ohne das Ganze neu zu initialisieren.

Antwort

1

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 ...

-1

Sicher, tun gerade:

# configure to only fetch master branch 
git config --replace-all remote.origin.fetch +refs/heads/master:refs/remotes/origin/master 
# delete all remote tracking branches 
git for-each-ref refs/remotes/origin --format='%(refname)' | xargs -l git update-ref -d 
# reinstante the still fetched branch ref 
git fetch origin 
# repack the repository to throw out the dangling commits from the deleted branches 
git repack -adl --depth=250 --window=250 

Dies reinigt nur wenn die Remote-Niederlassungen auf.
Die Tags, die abgerufen wurden, sind nicht identifizierbar, sie sind identisch mit lokal erstellten Tags.
Wenn Sie keine lokale Variablen haben oder nichts ausmacht, zu verlieren oder mit neuen Tags versehen, sie können Sie

git for-each-ref refs/remotes/origin --format='%(refname)' | xargs -l git update-ref -d 

von

git for-each-ref refs/remotes/origin refs/tags --format='%(refname)' | xargs -l git update-ref -d 

erhalten ersetzen auch die gelöschten Tags, die in den Punkt nicht Geschichte des immer noch geholten Zweiges.