用于修补的diff,无需重命名目标文件

时间:2012-03-09 18:52:38

标签: diff patch

如何使用diff -u创建标准补丁而不使用“新”文件的其他名称?

当我submitted a patch for an Apache project时,提交者建议我在提交补丁时不需要重命名文件。我可以理解这是如何打破修补,因为“新”文件的名称应该以某种方式匹配修补程序目标的名称 - 但是它们不能在同一目录中具有相同的名称。

是否可以(为了便于修补)重命名“旧”文件,以便我应该使用:

diff -u Source-old.java Source.java

而不是:

diff -u Source.java Source-new.java

1 个答案:

答案 0 :(得分:1)

鉴于现有项目'a',将整个项目复制到'b',在'b'中进行更改。在原始目录和复制的目录之间生成差异。

,检查或下载项目到目录'a',复制到'b':

$ tree a
a
`-- dir
    |-- Bar.java
    `-- Foo.java

$ cp -r a b 

$ tree b
b
`-- dir
    |-- Bar.java
    `-- Foo.java

对'b'进行更改(仅限'b'):

$ diff -r -s a b
Files a/dir/Bar.java and b/dir/Bar.java are identical
Files a/dir/Foo.java and b/dir/Foo.java are identical

$ sed -i  's/Foo.*$/& \/* Change...*\//' b/dir/Foo.java 

$ diff -ruN  a b  | tee a.patch
diff -ruN a/dir/Foo.java b/dir/Foo.java
--- a/dir/Foo.java  2012-08-02 18:41:39.444720785 -0700
+++ b/dir/Foo.java  2012-08-02 18:46:45.319932802 -0700
@@ -1,2 +1,2 @@
 package dir;
-public class Foo {}
+public class Foo {} /* Change...*/

$ gzip a.patch

另一种方法是将原始源存储在临时的本地git存储库中,然后使用git的内置diff来生成补丁。或者,更好的是,如果原始源使用git,那么只需克隆repo并直接在源树本身中工作,并且(仍)使用git生成补丁。