Ich fürchte, ich konnte so etwas wie dieses spezielle Szenario nicht finden.
Ich habe ein Git-Repository mit viel Geschichte: mehr als 500 Filialen, mehr als 500 Tags, die bis Mitte 2007 zurückreichen. Es enthält ~ 19.500 Commits. Wir möchten den gesamten Verlauf vor dem 1. Januar 2010 entfernen, um ihn kleiner und einfacher zu handhaben (wir würden eine vollständige Kopie des Verlaufs in einem Archiv-Repository aufbewahren).
Ich kenne das Commit, das ich zum Stamm des neuen Repositorys werden möchte. Ich kann jedoch nicht das richtige Git-Mojo herausfinden, um das Repo abzuschneiden und mit diesem Commit zu beginnen. Ich vermute eine Variante von
git filter-branch
die Einbeziehung von Transplantaten wäre notwendig; Es kann auch notwendig sein, jeden der über 200 Zweige, die wir behalten möchten, separat zu behandeln und dann das Repo wieder zusammenzufügen (etwas, das ich zu tun weiß).
Hat jemand jemals so etwas getan? Ich habe Git 1.7.2.3, wenn das wichtig ist.
quelle
git filter-branch --tag-name-filter cat -- --all
, um Tags zu aktualisieren. Ich habe aber auch ältere Tags, die auf den alten Verlauf verweisen, den ich löschen möchte. Wie kann ich all diese alten Tags loswerden? Wenn ich sie nicht lösche, verschwindet der ältere Verlauf nicht und ich kann ihn immer noch mit sehengitk --all
.echo "<NEW-ROOT-HASH>" > .git/info/grafts
Vielleicht ist es zu spät, um eine Antwort zu veröffentlichen, aber da diese Seite das erste Ergebnis von Google ist, kann sie dennoch hilfreich sein.
Wenn Sie etwas Speicherplatz in Ihrem Git-Repo freigeben möchten, aber nicht alle Ihre Commits (Rebase oder Graft) neu erstellen möchten und dennoch in der Lage sind, von Personen mit dem vollständigen Repo zu pushen / ziehen / zusammenzuführen, können Sie das Git verwenden Klon flacher Klon ( Parameter --depth ).
Sie können Ihr vorhandenes Repo möglicherweise flacher machen, indem Sie die folgenden Schritte ausführen:
Wie entferne ich alle lokalen Git-Tags?
Ps: Ältere Versionen von git haben das Klonen / Drücken / Ziehen von / zu flachen Repos nicht unterstützt.
quelle
cd
zu einem Ordner gelangen, der gerade gelöscht wurde? Ich habe das Gefühl, dass hier einige Informationen fehlen. Gibt es auch eine Möglichkeit, diese Änderungen auf das Remote-Repo anzuwenden?git clone file:///Users/me/Projects/myProject myClonedProject --shallow-since=2016-09-02
Funktioniert wie ein Zauber!git filter-branch -- --all
. Dies wird alle Hashes darin ändern, aber danach können Sie es auf ein neues Repo verschiebenDiese Methode ist leicht zu verstehen und funktioniert gut. Das Argument für script (
$1
) ist ein Verweis (Tag, Hash, ...) auf das Commit, ab dem Sie Ihren Verlauf beibehalten möchten.HINWEIS : Alte Tags bleiben weiterhin vorhanden. Daher müssen Sie sie möglicherweise manuell entfernen
Bemerkung: Ich weiß, dass dies fast die gleiche Antwort wie @yoyodin ist, aber hier gibt es einige wichtige zusätzliche Befehle und Informationen. Ich habe versucht, die Antwort zu bearbeiten, aber da es sich um eine wesentliche Änderung der Antwort von @ yoyodin handelt, wurde meine Bearbeitung abgelehnt. Hier sind die Informationen!
quelle
git prune
undgit gc
. Gibt es eine Erklärung für den Rest der Befehle im Skript? Derzeit ist nicht klar, welche Argumente an ihn übergeben werden und was die einzelnen Befehle tun. Vielen Dank.-p
zumrebase
BefehlVersuchen Sie diese Methode So schneiden Sie den Git-Verlauf ab :
Hier
$1
ist SHA-1 des Commits, das Sie behalten möchten, und das Skript erstellt einen neuen Zweig, der alle Commits zwischen$1
und enthält,master
und der gesamte ältere Verlauf wird gelöscht. Beachten Sie, dass dieses einfache Skript davon ausgeht, dass kein Zweig aufgerufen wurdetemp
. Beachten Sie auch, dass dieses Skript die Git-Daten für den alten Verlauf nicht löscht. Führengit gc --prune=all && git repack -a -f -F -d
Sie aus, nachdem Sie überprüft haben, dass Sie wirklich den gesamten Verlauf verlieren möchten. Möglicherweise müssen Sierebase --preserve-merges
jedoch gewarnt werden, dass die Git-Implementierung dieser Funktion nicht perfekt ist. Überprüfen Sie die Ergebnisse manuell, wenn Sie diese verwenden.quelle
rebase
Schritt wurden Zusammenführungskonflikte festgestellt. Seltsam - ich hatte nicht erwartet, dass Zusammenführungskonflikte unter diesen Umständen möglich sein könnten.git commit --allow-empty -m "Truncate history"
Sie diese Option, wenn das ausgecheckte Commit keine Dateien enthält.Als Alternative zum Umschreiben des Verlaufs sollten Sie die Verwendung
git replace
wie in diesem Artikel aus dem Pro Git- Buch in Betracht ziehen . In dem besprochenen Beispiel wird ein übergeordnetes Commit ersetzt, um den Beginn eines Baums zu simulieren, während der gesamte Verlauf als separater Zweig zur sicheren Aufbewahrung beibehalten wird.quelle
git replace
. Ich glaube, dies wurde bei einer anderen Frage korrigiert, bei der Sie diese Antwort gepostet haben.git replace
versusgit graft
wird unter stackoverflow.com/q/6800692/873282Wenn Sie das Upstream- Repository mit dem vollständigen Verlauf , aber lokalen kleineren Kassen behalten möchten , führen Sie einen flachen Klon mit durch .
git clone --depth=1 [repo]
Nachdem Sie ein Commit gedrückt haben, können Sie dies tun
git fetch --depth=1
die alten Verpflichtungen zu beschneiden. Dies macht die alten Commits und ihre Objekte unerreichbar.git reflog expire --expire-unreachable=now --all
. Alle alten Commits und ihre Objekte ablaufen lassengit gc --aggressive --prune=all
um die alten Objekte zu entfernenSiehe auch So entfernen Sie den lokalen Git-Verlauf nach einem Commit. .
Beachten Sie, dass Sie dieses "flache" Repository nicht an eine andere Stelle verschieben können: "flache Aktualisierung nicht zulässig". Siehe Remote abgelehnt (flaches Update nicht erlaubt), nachdem die Git-Remote-URL geändert wurde . Wenn du das willst, musst du beim Pfropfen bleiben.
quelle
Ich musste mehrere Antworten und andere Informationen lesen, um zu verstehen, was ich tat.
1. Ignorieren Sie alles, was älter als ein bestimmtes Commit ist
Die Datei
.git/info/grafts
kann gefälschte Eltern für ein Commit definieren. Eine Zeile mit nur einer Commit-ID besagt, dass das Commit kein übergeordnetes Element hat. Wenn wir sagen wollten, dass uns nur die letzten 2000 Commits wichtig sind, können wir Folgendes eingeben:git rev-parse gibt uns die Commit-ID des 2000. übergeordneten Elements des aktuellen Commits. Der obige Befehl überschreibt die Transplantatdatei, falls vorhanden. Überprüfen Sie, ob es zuerst da ist.
2. Schreiben Sie den Git-Verlauf neu (optional)
Wenn Sie dieses gepfropfte falsche Elternteil zu einem echten machen möchten, führen Sie Folgendes aus:
Es werden alle Commit-IDs geändert. Jede Kopie dieses Repositorys muss unbedingt aktualisiert werden.
3. Bereinigen Sie den Speicherplatz
Ich habe Schritt 2 nicht ausgeführt, weil ich wollte, dass meine Kopie mit dem Upstream kompatibel bleibt. Ich wollte nur etwas Speicherplatz sparen. Um alle alten Verpflichtungen zu vergessen:
Alternative: flache Kopien
Wenn Sie eine flache Kopie eines anderen Repositorys haben und nur Speicherplatz sparen möchten, können Sie ein Update durchführen
.git/shallow
. Aber seien Sie vorsichtig, dass nichts auf ein Commit von früher hinweist. Sie könnten also so etwas ausführen:Der Eintrag in flach funktioniert wie ein Transplantat. Achten Sie jedoch darauf, keine Transplantate zu verwenden und gleichzeitig flach zu sein. Zumindest nicht die gleichen Einträge, es wird fehlschlagen.
Wenn Sie noch einige alte Referenzen (Tags, Zweige, Remote-Köpfe) haben, die auf ältere Commits verweisen, werden diese nicht bereinigt und Sie sparen nicht mehr Speicherplatz.
quelle
git replace
stattdessen. Siehe stackoverflow.com/questions/6800692/…Beim Rebase oder Push to Head / Master kann dieser Fehler auftreten
Um dieses Problem im Git-Dashboard zu beheben, sollte der Hauptzweig aus "Geschützte Zweige" entfernt werden.
Dann können Sie diesen Befehl ausführen
oder
quelle
Hier gibt es zu viele Antworten, die nicht aktuell sind, und einige erklären die Konsequenzen nicht vollständig. Folgendes hat für mich funktioniert, um den Verlauf mit dem neuesten Git 2.26 zu verkürzen:
Erstellen Sie zuerst ein Dummy-Commit. Dieses Commit wird als erstes Commit in Ihrem abgeschnittenen Repo angezeigt. Sie benötigen dies, da dieses Commit alle Basisdateien für den von Ihnen gespeicherten Verlauf enthält. Die SHA ist die ID des vorherigen Commits des Commits, das Sie behalten möchten (in diesem Beispiel
8365366
). Die Zeichenfolge 'Initial' wird als Commit-Nachricht des ersten Commits angezeigt. Wenn Sie Windows verwenden, geben Sie den folgenden Befehl an der Eingabeaufforderung von Git Bash ein.Der obige Befehl gibt beispielsweise SHA aus
d10f7503bc1ec9d367da15b540887730db862023
.Geben Sie jetzt einfach Folgendes ein:
Dadurch werden zuerst alle Dateien ab dem Festschreiben
8365366
in das Dummy-Festschreiben eingefügtd10f750
. Dann werden alle Commits nach 8365366 über dem Ende wiedergegebend10f750
. Schließlich wird dermaster
Verzweigungszeiger auf das zuletzt wiedergegebene Commit aktualisiert.Wenn Sie diese abgeschnittenen Repos verschieben möchten, tun Sie dies einfach
git push -f
.Einige Dinge zu beachten (dies gilt sowohl für andere als auch für diese Methoden): Tags werden nicht übertragen. Während Commit-IDs und Zeitstempel erhalten bleiben, wird GitHub diese Commits in einer pauschalen Überschrift wie anzeigen
Commits on XY date
.Glücklicherweise ist es möglich, den abgeschnittenen Verlauf als "Archiv" beizubehalten. Später können Sie das zugeschnittene Repo mit dem Archiv-Repo verbinden. Informationen hierzu finden Sie in dieser Anleitung .
quelle
Sie können das Verzeichnis, die Dateien und auch den gesamten Verlauf des Verzeichnisses oder der Datei löschen, indem Sie das unten angegebene jar [download it] und die Befehle verwenden
bfg.jar-Datei: https://rtyley.github.io/bfg-repo-cleaner/
git clone --bare repo-url cd repo_dir java -jar bfg.jar --delete-folders ordnername git reflog expire --expire = now --all && git gc --prune = now --aggressive git push --mirror repo_url
quelle
quelle