如何让svn diff生成可应用补丁的文件,当使用了svn cp或svn mv命令时?

65

情景如下:

  1. 复制或移动某个文件
  2. 修改该文件
  3. svn diff > mypatch

在另一台机器上(相同的工作副本,但没有更改):

  1. 尝试应用 mypatch。
  2. 失败 - 尝试修改不存在的文件。

我该如何让 svn diff 生成可应用的补丁(patch),或在这种情况下干净地应用由 svn diff 生成的补丁?我不能提交。我希望保留合并信息(因为明显的解决方法是将该文件作为全新添加,而不与以前的文件相关联)。

4个回答

64

使用 Subversion,您可以指定要使用的 diff 二进制文件以及传递给它的参数。请参见 svn diff 的手册。

您希望从 svn diff 中生成常规补丁文件,因此您需要使 svn diff 看起来像一个普通的 diff。尝试这个:

svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
...
patch -p0 < mypatch

概念验证:

echo "newline" >> README.txt
svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
cp README.txt README.txt.patched
svn revert README.txt
patch -p0 < mypatch
diff README.txt README.txt.patched

打补丁后两个文件没有区别。


3
如果分支之间存在属性更改,则此方法不起作用。 - Will Sargent
6
这对我不起作用。生成的补丁文件仍然显示复制的文件是原始文件的修改版本(例如,它具有以 - 开头的行以及不以 - 或 + 开头的行)。此外,尝试打补丁会产生以下结果:“12个补丁块中有14个失败--将拒绝保存到文件”。您是否尝试过使用实际包含内容的源文件和与源文件不同的目标文件进行操作? - Garret Wilson
1
我也在寻找同样的东西,这个方法非常有效,谢谢。 - nivanka
2
按照 OP 的步骤(svn mv,修改新文件)和您的 diff 和 patch 命令,我得到了与 OP 所述相同的结果 - patch 抱怨新文件不存在,因此不知道要打补丁的内容。 - DevDaddyNick

12

如果你想在补丁中一并去除svn属性,有一个选项可以实现:

svn diff --patch-compatible > mypatch.diff

svn help diff显示:

  --patch-compatible   : generate diff suitable for generic third-party
                         patch tools; currently the same as
                         --show-copies-as-adds --ignore-properties

这种方式创建的补丁应该与传统的 patch 工具兼容。


2
这个回答比得到更多赞的回答更接近预期结果。这个回答实际上从文件中删除了被移动的内容,并为新文件添加了正确的修改。但它将原始文件显示为简单修改且没有内容,将新文件显示为未版本化的文件。尽管如此,这仍然是我看到的最好的回答原问题。 - DevDaddyNick

5

你曾尝试过在svn diff网页上提到并在svn选项页面上描述的--show-copies-as-adds选项吗?


-1

如果不了解您要处理的具体情况,很难确定为什么要这样做。我有一种感觉,您正在尝试在隔离的环境中进行受控更改,以避免影响其他用户/应用程序。

您能通过以下方式解决此问题吗:

  • 为代码更改创建分支
  • 在分支上执行复制/移动和更改操作
  • 让另一方切换到这个新代码分支,并继续共享这个分支

当两个人都同意更改后,使用--reintegrate参数合并回主干并删除该分支?

这将 * 保持合并信息 * 在版本控制中识别复制/移动和更改 * 仍然隔离其他用户的更改 * 可以防止步骤2中出现不完整的更改问题,因为您可以添加更多的更改并更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接