Ich habe einige alte Zweige in meinem Git-Repository, die sich nicht mehr in der aktiven Entwicklung befinden. Ich möchte die Zweige archivieren, damit sie beim Ausführen nicht standardmäßig angezeigt werden git branch -l -r
. Ich möchte sie nicht löschen, weil ich den Verlauf behalten möchte. Wie kann ich das machen?
Ich weiß, dass es möglich ist, einen Schiedsrichter außerhalb von Schiedsrichtern / Köpfen zu erstellen. Zum Beispiel refs/archive/old_branch
. Gibt es irgendwelche Konsequenzen dafür?
git checkout [rev] file
Attic/<branchname>
leichte Tags, um Zweige zu archivieren.Antworten:
Ich glaube, der richtige Weg, dies zu tun, besteht darin, den Zweig zu markieren. Wenn Sie den Zweig löschen, nachdem Sie ihn markiert haben, haben Sie den Zweig effektiv beibehalten, aber Ihre Zweiglistenliste wird dadurch nicht überladen.
Wenn Sie zum Zweig zurückkehren müssen, überprüfen Sie einfach das Tag. Der Zweig aus dem Tag wird effektiv wiederhergestellt.
So archivieren und löschen Sie den Zweig:
So stellen Sie den Zweig einige Zeit später wieder her:
Der Verlauf des Zweigs bleibt genau so erhalten, wie er war, als Sie ihn markiert haben.
quelle
git checkout -b <branchname> archive/<branchname>
branch -D
da es wahrscheinlich nicht vollständig zusammengeführt wird, wenn Sie es auf diese Weise archivierenJeremys Antwort ist im Prinzip richtig, aber meiner Meinung nach sind die von ihm angegebenen Befehle nicht ganz richtig.
So archivieren Sie einen Zweig in einem Tag, ohne den Zweig auschecken zu müssen (und daher nicht in einen anderen Zweig auschecken zu müssen, bevor Sie diesen Zweig löschen können):
Und so stellen Sie einen Zweig wieder her:
quelle
Ja, Sie können eine Referenz mit einem nicht standardmäßigen Präfix erstellen
git update-ref
. z.Bgit update-ref refs/archive/old-topic topic && git branch -D topic
git branch topic refs/archive/old-topic
Refs mit Nicht-Standard - Präfix (hier
refs/archive
) zeigt nicht auf übliche upgit branch
,git log
nochgit tag
. Trotzdem können Sie sie mit auflistengit for-each-ref
.Ich verwende folgende Aliase:
Möglicherweise möchten Sie auch Fernbedienungen so konfigurieren
push = +refs/archive/*:refs/archive/*
, dass archivierte Zweige automatisch (odergit push origin refs/archive/*:refs/archive/*
einmalig) übertragen werden.Eine andere Möglichkeit besteht darin, SHA1 irgendwo vor dem Löschen des Zweigs aufzuschreiben, es gibt jedoch Einschränkungen. Commits ohne Ref werden nach 3 Monaten (oder ein paar Wochen ohne Reflog) durchgeführt , geschweige denn manuell
git gc --prune
. Commits, auf die durch Refs hingewiesen wird, sind vor GC sicher.Bearbeiten: Eine Perl-Implementierung derselben Idee von @ap gefunden :
git-attic
Bearbeiten ^ 2: Gefunden einen Blog - Post , wo Gitster sich mit der gleichen Technik.
quelle
Ich habe Steves Antwort erweitert , um die Änderungen auf der Fernbedienung widerzuspiegeln
Informationen zum Wiederherstellen von der Fernbedienung finden Sie in dieser Frage .
quelle
Sie können die Zweige in einem anderen Repository archivieren. Nicht ganz so elegant, aber ich würde sagen, es ist eine praktikable Alternative.
quelle
git-bundle
anstelle eines separaten Repositorys erstellen .Hier ist ein Alias dafür:
Fügen Sie es so hinzu:
Beachten Sie, dass
git archive
bereits ein Befehl vorhanden ist , den Sie nichtarchive
als Aliasnamen verwenden können.Sie können auch einen Alias definieren, um die Liste der 'archivierten' Zweige anzuzeigen:
über das Hinzufügen von Aliasen
quelle
!git tag archive/$1 $1 && git branch -D
Ich verwende folgende Aliase, um archivierte Zweige auszublenden:
So
git br
zeigen Sie aktiv entwickelte Zweige undgit bra
alle Zweige einschließlich "archivierter" .quelle
Ich würde keine Zweige archivieren. Anders ausgedrückt, Zweige archivieren sich. Sie möchten sicherstellen, dass die für Archäologen relevanten Informationen auf zuverlässige Weise gefunden werden können. Sie sind zuverlässig, da sie die tägliche Entwicklung unterstützen und dem Prozess der Erledigung der Arbeit keinen zusätzlichen Schritt hinzufügen. Das heißt, ich glaube nicht, dass die Leute daran denken werden, ein Tag hinzuzufügen, wenn sie mit einem Zweig fertig sind.
Hier sind zwei einfache Schritte, die der Archäologie und Entwicklung sehr helfen .
git merge --no-ff
diese Option immer zum Zusammenführen von Aufgabenzweigen. Sie möchten, dass das Zusammenführungs-Commit und die Verlaufsblase auch nur für ein Commit ausgeführt werden.Das ist es. Warum? Weil ich als Code-Archäologe selten anfange zu wissen, was an einem Zweig gearbeitet wurde. Viel häufiger ist
es der Grund, warum in all den schreienden neun Höllen der Code so geschrieben ist?!Ich muss den Code ändern, aber er hat einige seltsame Funktionen, und ich muss sie rätseln, um zu vermeiden, dass etwas Wichtiges kaputt geht.Der nächste Schritt besteht
git blame
darin, die zugehörigen Commits zu finden und dann zu hoffen, dass die Protokollnachricht erklärend ist. Wenn ich tiefer graben muss, werde ich herausfinden, ob die Arbeit in einem Zweig erledigt wurde, und den Zweig als Ganzes lesen (zusammen mit seinem Kommentar im Issue-Tracker).Sagen wir
git blame
Punkte bei Commit XYZ. Ich öffne einen Git-Verlaufsbrowser (gitk, GitXgit log --decorate --graph
usw.), finde Commit XYZ und sehe ...Da ist meine Filiale! Ich weiß, dass QQ, UU, XYZ, JJ und MM alle Teil desselben Zweigs sind, und ich sollte in ihren Protokollnachrichten nach Einzelheiten suchen. Ich weiß, dass GG ein Merge-Commit sein wird und den Namen des Zweigs hat, der hoffentlich mit einem Problem im Tracker verbunden ist.
Wenn ich aus irgendeinem Grund einen alten Zweig finden möchte, kann ich ihn ausführen
git log
und im Merge-Commit nach dem Zweignamen suchen. Es ist selbst in sehr großen Repositories schnell genug.Das meine ich, wenn ich sage, dass Filialen sich selbst archivieren.
Das Markieren jedes Zweigs fügt unnötige Arbeit hinzu, um Dinge zu erledigen (ein kritischer Prozess, der rücksichtslos rationalisiert werden sollte), fasst die Tag-Liste (nicht von Leistung, sondern menschlicher Lesbarkeit) mit Hunderten von Tags zusammen, die nur sehr gelegentlich nützlich sind und nicht. Es ist sogar sehr nützlich für die Archäologie.
quelle
Mein Ansatz ist es, alle Zweige, die mir egal sind, mit dem Präfix "trash_" umzubenennen und dann Folgendes zu verwenden:
(mit einer Shell-Schlüsselbindung)
Um die Farbe des aktiven Zweigs beizubehalten, müsste man:
quelle
Sie können ein Skript verwenden, das den Zweig für Sie archiviert
Erzzweig
Es erstellt ein Tag für Sie mit dem Präfixarchiv / und löscht dann den Zweig. Überprüfen Sie jedoch den Code, bevor Sie ihn verwenden.
Verwendung -
$/your/location/of/script/archbranch [branchname] [defaultbranch]
Wenn Sie das Skript ausführen möchten, ohne den Speicherort darauf zu schreiben, fügen Sie es Ihrem Pfad hinzu
Dann können Sie es anrufen
Dies
[defaultbranch]
ist der Zweig, in den es nach Abschluss der Archivierung verschoben wird. Es gibt einige Probleme mit der Farbcodierung, aber andere, dass es funktionieren sollte. Ich habe es schon lange in Projekten verwendet, aber es befindet sich noch in der Entwicklung.quelle
Ich archiviere manchmal Zweige wie folgt:
format-patch <branchName> <firstHash>^..<lastHash>
(holen Sie sich firstHash und lastHash mitgit log <branchName>
.git branch -D <branchName>
Wenden Sie den Patch an, wenn Sie den Zweig erneut verwenden müssen. Das Anwenden der Patch-Dateien (siehe
git am
) kann jedoch je nach Status des Zielzweigs eine Herausforderung darstellen. Auf der positiven Seite hat dieser Ansatz den Vorteil, dass die Commits der Filiale durch Müll gesammelt werden können und Platz in Ihrem Repo gespart wird.quelle