2016-08-08 55 views
1

我想列出complete history of Linux作爲一系列補丁(採用統一差異格式),我可以從第一個補丁自動處理到今天的主人。理論上,這將允許我從日誌中重建現代版本。對於這個我運行下面的命令:如何用git log獲得一系列可以自動應用的補丁?

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

遺憾的是,似乎git log,或者是由於我給它或因錯誤,開始(後1280次的提交)不正確的選項輸出是做差異不符合之前的狀態,因此不能自動應用(例如通過補丁)。

作爲示例,運行git log -m -M -C --pretty=tformat:'commit %H %ct' --topo-order --reverse -U0 43acd296..9b7855ca -- drivers/usb/auerswald.c 產生一個diff該貼劑(1)不能在修改43acd296適用於檢出系統。 (問題與使用連續日誌輸出時發生的問題相同。)相反,運行git diff -U0 43acd296 9b7855ca -- drivers/usb/auerswald.c會生成一個diff,可以將其應用於版本43acd296,而不會出現問題。

爲了獲得我想要的輸出,我是否應該給git log提供其他選項? (我試過--full-history,但問題依然存在。)

回答

1

你或許應該使用git format-patch

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.

一般語法是:

git format-patch <revision range> 

哪裏<revision range>是可以提交的範圍,如88236e3..40bc760

您將獲得每個提交一個文件,按順序命名。

+0

謝謝!你爲什麼認爲'git-format-patch'可以避免我用'git-log'看到的問題?另外,我想指定一個簡潔的機器可讀輸出格式,'git-format-patch'似乎沒有提供'--format'選項。 –

+1

我建議使用'git-format-patch',因爲它似乎設計用來做你想做的事(產生一系列一次提交 - 每個補丁),而不像'git log'它明確地設計爲提供*輸入*回到混帳。我不知道如何調和「簡潔,機器可讀」和「生成補丁」,所以我不能在那裏提供任何建議。 – larsks

+0

似乎'git format-patch'不足以導出整個存儲庫。當我用'(cd「$ 1」&& git --no-stat -M -C --stdout --root HEAD)複製repos時| (rm -rf「$ 2」&& mkdir「$ 2」&& cd「$ 2」&& git init && git am)'在Docker Git repo上出現錯誤'error:patch failed:filesystem.go:7 error:filesystem.go :補丁不適用補丁失敗0062' –