2011-09-20 104 views
21

場景:我有一個修補程序文件,它可以乾淨地應用於我的工作文件,但我不希望修補程序發生所有更改。如何幹淨地編輯差異/補丁文件?有沒有補丁文件編輯器?

通常,我做vim example.patch,刪除不需要的更改,它們應用patch -p0 -i example.patch但有時補丁不適用於乾淨,我必須重新開始。

是否有一個補丁文件編輯器,允許用戶編輯和刪除補丁的一部分,仍然可以乾淨地應用?

+0

爲什麼不創建第二個補丁? – Johnsyweb

+2

請參閱http://stackoverflow.com/questions/242646/use-vimdiff-with-a-diff-file – dmedvinsky

+0

我需要在這裏。我需要在應用之前編輯補丁文件,並且無法生成其他補丁。所以:是否有補丁文件編輯器允許用戶編輯和/或刪除補丁的一部分,仍然能夠清晰地應用? –

回答

1

不要手動編輯補丁文件。在你的情況下,你可以嘗試一些交互工具來應用你的補丁塊,如ipatch

14

如果你在emacs中打開一個diff文件,並把編輯器置於「diff」模式,你可以實際編輯補丁,它會更新聰明的方式,大塊的標記。對我來說真的很好!

+0

是的!謝謝!這完美! –

2

您使用的是什麼SCM?如果使用的Git,您可以:

  • 之前產生的實際補丁使用git add -p只有你的修改增加的部分。生成較小的提交併且只進行相關更改是一種很好的做法(但有些組織不喜歡這種方式,只允許進行巨型提交)。

  • 如果您已經有該補丁應用它,請使用git add -p將您想保留的代碼部分添加到您的索引中。您可以提交併丟棄其餘(git co .)或存儲它(git stash)。

編輯(基於git的添加-p評論)

  • git add -p允許您使用-s選項分割大塊切成小塊,在情況下,當你需要更多的細節,你需要使用編輯的e選項,它會將你帶到你的gitconfig編輯器,它將會有關於如何編輯塊的說明。
+0

當我使用'git add -p'時(即在「手動編輯模式」中)時,我有這個問題,因爲有時候不可能將差異分成乾淨的區塊並且需要一些手動差異編輯。 – Jawa

+0

'git add -p'的問題在於它只提供'git diff'(及其底層驅動程序)所提供的小部分功能。例如,如果我想弄明白在提交之前所做的更改,可以使用'-w'標誌來指示'git diff'來忽略空格,如果我想'git add -p'其中一些交互式更改,因爲'git add'沒有'-w'。人們所做的是,他們用'git diff -w ...'生成補丁文件,然後使用'git apply',但是這又將它們帶回到補丁編輯器 - 因爲'git add'沒有幫助他們。 – amn

5

如果您正在尋找非交互式解決方案,patchutilsrediff是有幫助的。

下面是它的man描述:

您可以使用rediff糾正手工編輯的標準差異。取一個要編輯的差異的副本 ,並編輯它,而不更改任何偏移量 或計數(以「@@」開頭的行)。然後運行rediff,告訴它 原始差異文件的名稱和您編輯的 的名稱,它會輸出編輯後的差異文件,但會有修正後的 偏移和計數。

提供了一個小腳本editdiff,用於就地編輯diff文件 。

當前處理的變化的類型有:

  • 修改(當然)任何文件內容行的文本。
  • 添加新的行插入或刪除。
  • 添加,更改或刪除上下文行。通過調整偏移量和/或計數來處理上下文範圍內的行。
  • 添加一個大塊(@@ - 前綴部分)。
  • 刪除多個大塊(@@ - 前綴部分)。

基於其描述,recountdiff也可能是解決統一區別的潛在候選。