10 Stimmen

Git: wie man die Historie vor einem bestimmten Commit entfernt

Das heißt, ich habe:

root -- c1 -- c2 -- .. - c1000 -- c1001 -- c1002 -- .. -- c2000 -- top

und die ich haben möchte:

root = c1000 -- c1001 -- c1002 -- .. -- c2000 -- top

Wie?

(Ich schätze, ich kann das über git filter-branch aber wie genau?)

(Natürlich weiß ich, dass dies eine Umschreibung der Geschichte bedeutet...)

10voto

manojlds Punkte 273771

Ich habe das unten stehende als nützlich empfunden, um neue Repos mit einem anderen Root zu erstellen (was ich denke, dass Sie fragen, wenn Sie sagen, dass Sie die Historie vor einem Commit entfernen):

git fast-export master~5..master | (cd ../newrepo.git && git init . && git fast-import && git checkout)

(Sie können die obigen Schritte auch im gleichen Repo durchführen)

4voto

Lily Ballard Punkte 175449

Am einfachsten geht das mit einem git graft. Wenn Sie die Datei .git/info/grafts bearbeiten, können Sie Zeilen in der Form

[ref] [parent1] [parent2] ...

Alle Commits, auf die auf der linken Seite verwiesen wird, werden dann so behandelt, als ob die auf der rechten Seite aufgelisteten Eltern die Eltern dieses Commits wären. Sie können also eine Zeile einfügen wie

c1000

und es wird so behandelt, als ob es keine Eltern hätte. Dies kann dann durch Ausführen von git-filter-branch "in Stein gemeißelt" werden.

2voto

VonC Punkte 1117238

Beachten Sie, dass mit Git 2.21 (Q1 2019, 7+ Jahre später), git fast-export ist vollständiger.

Das heißt, die Lösung basiert auf git fast-export / import können jetzt mehr tun.

git fast-export master~5..master | \
  (cd ../newrepo.git && git init . && git fast-import && git checkout)

Voir a965bb3 übergeben , 25dd3e4 festlegen , 530ca19 übertragen , Commit fdf31b6 , cd13762 festlegen , Übergabe f129c42 , Commit 1f30c90 , Übergabe b93b81e , Commit 4532be7 , Commit f55c979 , 843b9e6 übergeben (16. Nov. 2018) von Elijah Newren ( newren ) .
(Zusammengefasst von Junio C. Hamano -- gitster -- in Übergabe 4d59753 , 04. Januar 2019)

fast-export: Hinzufügen der Option --show-original-ids zur Anzeige der Originalnamen

Die Kenntnis der ursprünglichen Namen (Hashes) von Commits kann manchmal eine Nachfilterung ermöglichen, die sonst schwierig oder unmöglich wäre.
Insbesondere ist es sehr schwierig, Commit-Meldungen umzuschreiben, die sich auf andere frühere Commits beziehen (zusätzlich zu allen anderen Filterungen), ohne die ursprünglichen Namen der einzelnen Commits zu kennen.

Darüber hinaus kann die Kenntnis der ursprünglichen Namen (Hashes) von Blobs eine Filterung nach blob-id ohne dass der Inhalt des Blobs erneut gehasht werden muss, und ist daher als kleine Optimierung nützlich.

Sobald wir die Original-IDs für Commits und Blobs hinzugefügt haben, können wir sie der Vollständigkeit halber auch für Tags hinzufügen.
Vielleicht hat ja jemand eine Verwendung für sie.

Dieser Commit lehrt eine neue --show-original-ids Option für den Schnellexport, die das Hinzufügen eines ' original-oid <hash> Zeile zu Blob, Commits und Tags.
Sie lehrt auch fast-import um solche Zeilen zu analysieren (und zu ignorieren).

Le site Manpage zeigt jetzt:

--show-original-ids:

Hinzufügen einer zusätzlichen Direktive zur Ausgabe für Commits und Blobs, original-oid <SHA1SUM> .
Während solche Richtlinien wahrscheinlich von Importeuren wie git-fast-import kann es für Zwischenfilter nützlich sein ( z.B. für das Umschreiben von Commit-Meldungen die sich auf ältere Commits beziehen, oder zum Strippen von Blobs nach Id ).

Und:

fast-export : hinzufügen --reference-excluded-parents Option

git filter-branch hat eine raffinierte Funktion, die es erlaubt, z.B. nur die letzten 8 Commits einer linearen Historie zu überschreiben

 git filter-branch $OPTIONS HEAD~8..HEAD

Wenn Sie das Gleiche versuchen mit git fast-export erhalten Sie stattdessen eine Geschichte von nur 8 Übertragungen, mit HEAD~7 in eine Root-Übertragung umgeschrieben wird.

Es gibt zwei Alternativen:

  1. Verwenden Sie nicht die negative Revisionsangabe, und wenn Sie die Ausgabe filtern, um Änderungen an den letzten 8 Commits vorzunehmen, achten Sie darauf, dass Sie keine früheren Commits irgendwie verändern.
  2. Erster Lauf ' git fast-export --export-marks=somefile HEAD~8 ', dann führen Sie ' git fast-export --import-marks=somefile HEAD~8..HEAD '.

Beide Optionen sind fehleranfälliger, als mir lieb ist (die erste aus offensichtlichen Gründen; bei der zweiten Option habe ich manchmal versehentlich zu viele Revisionen in den ersten Befehl aufgenommen und dann festgestellt, dass die entsprechenden zusätzlichen Revisionen durch den zweiten Befehl nicht exportiert und somit nicht wie erwartet geändert wurden).
Außerdem sind beide aus Sicht der Leistung schlecht.

Hinzufügen einer neuen --reference-excluded-parents Option, die dazu führt, dass fast-export um auf Commits außerhalb des angegebenen rev-list-args-Bereichs durch ihre sha1sum zu verweisen.
Ein solcher Stream ist nur in einem Repository sinnvoll, das bereits die notwendigen Commits enthält (ähnlich der Einschränkung, die bei der Verwendung von --no-data ).

Die Dokumentation enthält jetzt:

--reference-excluded-parents:

Standardmäßig wird die Ausführung eines Befehls wie git fast-export master~5..master wird die Übergabe nicht enthalten master~5 und wird master~4 haben nicht mehr master{tilde}5 als Elternteil (obwohl sowohl die alten master~4 und neu master~4 haben alle die gleichen Dateien).

使用方法 --reference-excluded-parents damit der Stream stattdessen auf Commits im ausgeschlossenen Bereich der Historie anhand ihrer Sha1-Summe verweist.
Beachten Sie, dass der resultierende Stream nur von einem Repository verwendet werden kann, das bereits die erforderlichen übergeordneten Übertragungen enthält .

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