419 Stimmen

Wie kann ich Git-Zweige archivieren?

Ich habe einige alte Zweige in meinem Git-Repository, an denen nicht mehr aktiv gearbeitet wird. Ich möchte die Zweige archivieren, damit sie nicht standardmäßig angezeigt werden, wenn ich git branch -l -r . Ich möchte sie nicht löschen, weil ich den Verlauf beibehalten möchte. Wie kann ich das tun?

Ich weiß, dass es möglich ist, einen Schiedsrichter außerhalb von refs/heads zu erstellen. Zum Beispiel, refs/archive/old_branch . Gibt es irgendwelche Konsequenzen, wenn man das tut?

556voto

Jeremy Wall Punkte 21945

Ich glaube, der richtige Weg, dies zu tun, ist, den Zweig zu markieren. Wenn Sie den Zweig löschen, nachdem Sie ihn markiert haben, haben Sie den Zweig zwar behalten, aber er wird Ihre Zweigliste nicht überladen.

Wenn Sie zur Zweigstelle zurückkehren müssen, sehen Sie sich einfach das Schild an. Dadurch wird die Verzweigung vom Tag aus wiederhergestellt.

So archivieren und löschen Sie den Zweig:

git tag archive/<branchname> <branchname>
git branch -d <branchname>

Um den Zweig zu einem späteren Zeitpunkt wiederherzustellen:

git checkout -b <branchname> archive/<branchname>

Die Geschichte des Zweigs bleibt genau so erhalten, wie sie war, als Sie ihn markiert haben.

183voto

Steve Punkte 2146

Jeremy's Antwort ist im Prinzip richtig, aber IMHO sind die von ihm genannten Befehle nicht ganz richtig.

So archivieren Sie einen Zweig in einem Tag, ohne den Zweig auschecken zu müssen (und somit ohne einen anderen Zweig auschecken zu müssen, bevor Sie diesen Zweig löschen können):

> git tag archive/<branchname> <branchname>
> git branch -D <branchname>

Und so wird ein Zweig wiederhergestellt:

> git checkout -b <branchname> archive/<branchname>

53voto

Liam Punkte 1221

Ausweitung von Steve's Antwort um die Änderungen auf der Fernbedienung wiederzugeben, habe ich

 git tag archive/<branchname> <branchname>
 git branch -D <branchname>
 git branch -d -r origin/<branchname>
 git push --tags
 git push origin :<branchname>

Zum Wiederherstellen aus der Ferne, siehe diese Frage .

43voto

snipsnipsnip Punkte 1931

Ja, Sie können eine Referenz mit einem nicht standardisierten Präfix erstellen, indem Sie git update-ref . z.B..

  • Archivieren Sie den Zweig: git update-ref refs/archive/old-topic topic && git branch -D topic
  • Stellen Sie den Zweig wieder her (falls erforderlich): git branch topic refs/archive/old-topic

Referenzen mit nicht standardisierten Präfixen (hier refs/archive ) wird nicht in den üblichen git branch , git log noch git tag . Dennoch können Sie sie auflisten mit git for-each-ref .

Ich verwende folgende Aliasnamen:

[alias]
    add-archive = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
    list-archive = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
    rem = !git add-archive
    lsrem = !git list-archive

Sie können auch Folgendes tun Fernbedienungen konfigurieren wie push = +refs/archive/*:refs/archive/* um archivierte Zweige automatisch zu verschieben (oder geben Sie einfach bei push an, wie git push origin refs/archive/*:refs/archive/* für eine einmalige Aktion).

Eine andere Möglichkeit ist, vor dem Löschen des Zweigs irgendwo SHA1 zu notieren, aber das hat seine Grenzen. Commits ohne Ref werden GC'd nach 3 Monaten (oder ein paar Wochen ohne Reflog) geschweige denn manuell git gc --prune . Von Schiedsrichtern angezeigte Verpflichtungen sind vor GC sicher.

編集する。 Ich fand eine Perl-Implementierung der gleichen Idee bei @ap : git-attic

Edit^2: Gefunden einen Blogbeitrag wo Gitster selbst die gleiche Technik anwendet. Er nannte es git hold .

20voto

August Lilleaas Punkte 52649

Sie können die Zweige in einem anderen Repository archivieren. Nicht ganz so elegant, aber ich würde sagen, es ist eine brauchbare Alternative.

git push git://yourthing.com/myproject-archive-branches.git yourbranch
git branch -d yourbranch

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X