当使用 svn cp 或 svn mv 时,如何使 svn diff 生成将应用补丁的文件?
Posted
技术标签:
【中文标题】当使用 svn cp 或 svn mv 时,如何使 svn diff 生成将应用补丁的文件?【英文标题】:How to make svn diff produce file that patch would apply, when svn cp or svn mv was used? 【发布时间】:2010-09-23 23:26:58 【问题描述】:场景是:
-
svn cp 或 mv 一些文件
修改该文件
svn diff > mypatch
在其他机器上(相同的工作副本,但没有变化):
-
尝试应用 mypatch。
失败 -> 尝试修改不存在的文件。
在这种情况下,如何让 svn diff 产生适用于补丁的补丁,或者干净地应用由 svn diff 产生的补丁?我不能答应。我想保留 mergeinfo(因为显而易见的解决方法是将文件添加为全新的文件,而不连接到前一个文件)。
【问题讨论】:
【参考方案1】:使用 subversion,您可以指定要使用的 diff 二进制文件,以及要传递给它的参数。在 svn diff 上查看 the manual。
您希望从 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
打补丁后两个文件没有区别。
【讨论】:
如果分支之间有属性变化,这不起作用。 这对我不起作用。生成的补丁文件仍将复制的文件显示为对原始文件的修改(例如,它具有以 - 开头的行以及不以 - 或 + 开头的行)。此外,修补的尝试会产生:“14 个大块中有 12 个失败 - 将拒绝保存到文件中”。您是否尝试过使用实际包含内容的源文件和内容与源文件不同的目标文件? 我正在寻找完全相同的东西,这很有魅力,谢谢 按照 OP 的步骤(svn mv,修改新文件)和您的差异和修补命令,我得到与 OP 所述相同的结果 - 补丁抱怨新文件不存在,所以它不知道要修补什么。【参考方案2】:如果你想在你的补丁中去掉 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
实用程序兼容。
【讨论】:
这比投票更多的答案更接近预期结果。这实际上从被移动的文件中删除了内容,并为新文件添加了正确的修改。但它将原始文件显示为简单修改且没有内容,而新文件显示为未版本控制的文件。尽管如此,这是迄今为止我看到的对原始问题的最佳答案。【参考方案3】:您是否尝试过svn diff 网页上提到的--show-copies-as-adds
选项以及svn options 页面上的描述?
【讨论】:
【参考方案4】:在不了解您尝试处理的具体场景的情况下,很难确定您为什么要这样做。我感觉您正在尝试在隔离环境中进行受控更改,以避免影响其他用户/应用程序。
你能解决这个问题吗?
为您的代码更改创建一个分支 在分支上执行复制/移动和更改 让对方切换到这个新的代码分支,继续分享这个分支当你们都同意使用 --reintegrate 参数将更改合并回主干并 rm 分支时?
这会 * 维护合并信息 * 识别版本控制中的复制/移动和更改 * 仍将更改与其他用户隔离 * 将防止第 2 步中的不完整更改成为问题,因为您可以添加更多更改并更新
【讨论】:
以上是关于当使用 svn cp 或 svn mv 时,如何使 svn diff 生成将应用补丁的文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 cvs2svn 时,如何重命名符号以使分支和标记解析为相同的名称?