2016-08-08 22 views
1

Ich möchte die complete history of Linux als eine Reihe von Patches (im einheitlichen Diff-Format) auflisten, die ich automatisch von der ersten bis zum heutigen Master verarbeiten kann. Theoretisch würde dies erlauben, die moderne Version aus dem Protokoll zu rekonstruieren. Dazu Ich verwende den folgenden Befehl ein:Wie kann ich mit git log eine Reihe von Patches erhalten, die automatisch angewendet werden können?

git -c diff.renameLimit=30000 log -m -M -C --pretty=tformat:'commit %H %ct' --topo-order --reverse -U0

Leider scheint es, dass git log, entweder durch falsche Optionen, die ich geben oder aufgrund eines Fehlers beginnt (nach 1280 Commits) Unterschiede ausgibt, das zu tun stimmt nicht mit dem vorherigen Zustand überein und kann daher nicht automatisch angewendet werden (z. B. durch Patch).

Als Beispiel läuft git log -m -M -C --pretty=tformat:'commit %H %ct' --topo-order --reverse -U0 43acd296..9b7855ca -- drivers/usb/auerswald.c erzeugt ein diff dass Patch (1)43acd296 nicht auf das ausgecheckt System bei Revision anwenden können. (Das Problem ist das gleiche wie bei der kontinuierlichen Protokollausgabe.) Im Gegensatz dazu generiert git diff -U0 43acd296 9b7855ca -- drivers/usb/auerswald.c ein Diff, das ohne Probleme auf die Revision 43acd296 angewendet werden kann.

Gibt es weitere Optionen, die ich an git log geben sollte, um den gewünschten Ausgang zu erhalten? (Ich habe versucht --full-history, aber das Problem bestand.)

Antwort

1

Sie wahrscheinlich git format-patch verwendet werden sollten:

Prepare each commit with its patch in one file per commit, formatted to resemble UNIX mailbox format. The output of this command is convenient for e-mail submission or for use with git am.

Die allgemeine Syntax ist:

git format-patch <revision range> 

Wo <revision range> ist, könnte eine Reihe von Commits sein , wie 88236e3..40bc760.

Sie erhalten als Ausgabe eine Datei pro Festschreibung, die sequenziell benannt wird.

+0

Vielen Dank! Warum denkst du, dass 'git-format-patch' das Problem, das ich mit' git-log' gesehen habe, vermeidet? Außerdem möchte ich ein knappes maschinenlesbares Ausgabeformat angeben, und "git-format-patch" scheint keine '--format'-Option zu bieten. –

+1

Ich schlug 'git-format-patch' vor, da es so konzipiert ist, dass es genau das tut, was Sie tun möchten (eine Reihe von Patches mit jeweils einem Commit erstellen). Im Gegensatz zu' git log' ist es explizit dafür vorgesehen zurück in git. Ich bin mir nicht sicher, wie ich "knapp, maschinenlesbar" mit "generiere einen Patch" abstimmen soll, so dass ich dort keine Vorschläge machen kann. – larsks

+0

Es scheint nicht, dass 'git format-patch' robust genug ist, um ein gesamtes Repository zu exportieren. Wenn ich Repos mit '(cd" $ 1 "&& git --no-stat -M -C --stdout --root HEAD) kopiere | (rm -rf "$ 2" && mkdir "$ 2" && cd "$ 2" && git init && git am) 'auf dem Docker Git Repo bekomme ich den Fehler' error: patch failed: filesystem.go: 7 error: filesystem.go : Patch wird nicht angewendet Patch ist fehlgeschlagen um 0062' –