如何使用diff递归地创建补丁文件


How to recursively create patch file using diff

我在Linux上,工作在一个PHP项目的分支。我想为我所做的工作创建一个补丁文件,可以应用于最新的父代码。原文件夹和新代码文件夹都有很多子目录深(所以需要递归)。

由于某些原因,当我这样做的时候:

diff -ur folder1 folder2 > newcode.patch

我没有设法得到包含所有新文件的补丁文件,它甚至不包含一些更深的文件更改(大约3+级深)。

有什么好主意吗?我看过梅尔德和迪夫了……

我怀疑您的目录结构类似于:

folder1/
  text.txt
  level1/
    text1.txt
    level2/
      text2.txt
      level3/
        text3.txt
folder2
  text.txt
  level1/
    text1.txt
    level2/
      text2.txt
      anewdirectory/
        newtext.txt
      level3/
        text3.txt
        newfiled3.txt

在这种情况下,diff将忽略anewdirectory/中的文件newtext.txt。它很可能也不会拾取newfiled3.txt的文本。相反,它报告如下内容:

..
Only in folder2/level1/level2/ : anewdirectory
Only in folder2/level1/level2/level3/ : newfiled3.txt
..

这就是你所看到的症状吗?
试一试:

diff -urBNs folder1/ folder2/ > code.patch

如果diff -r不像手册页中描述的那样工作,它显然是坏的;但是,我会使用原始代码创建一个本地版本控制存储库,然后,一旦提交了原始代码,再提交新代码。任何称职的版本控制系统都能够在提交的版本之间创建补丁。

我假设原始项目处于某个版本的源代码控制之下。如果是这样的话,应该有一些很好的工具为这个源代码控制系统构建,让你可以创建一个补丁。例如,如果源代码控制系统是Subversion (SVN),并且您使用的是Windows,则可以使用TortoiseSVN来构建该补丁。

不要重新发明轮子。