64

场景是:

  1. svn cp 或 mv 一些文件
  2. 修改那个文件
  3. svn diff > mypatch

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

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

在这种情况下,如何使 svn diff 产生适用于补丁的补丁,或者干净地应用由 svn diff 产生的补丁?我不能答应。我想保留mergeinfo(因为明显的解决方法是将文件添加为全新的文件,而不连接到前一个文件)。

4

4 回答 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

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

于 2008-11-26T05:41:33.483 回答
11

如果你想在你的补丁中去掉 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实用程序兼容。

于 2016-04-26T21:06:58.013 回答
5

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

于 2013-03-20T20:17:53.907 回答
-1

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

你能通过以下方式解决这个问题吗?

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

当您都同意使用 --reintegrate 参数将更改合并回主干并 rm 分支时?

这将 * 维护合并信息 * 识别版本控制中的复制/移动和更改 * 仍将更改与其他用户隔离 * 将防止第 2 步中的不完整更改成为问题,因为您可以添加更多更改和更新

于 2012-10-10T17:24:58.693 回答