情景如下:
- 复制或移动某个文件
- 修改该文件
- svn diff > mypatch
在另一台机器上(相同的工作副本,但没有更改):
- 尝试应用 mypatch。
- 失败 - 尝试修改不存在的文件。
我该如何让 svn diff 生成可应用的补丁(patch),或在这种情况下干净地应用由 svn diff 生成的补丁?我不能提交。我希望保留合并信息(因为明显的解决方法是将该文件作为全新添加,而不与以前的文件相关联)。
使用 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
打补丁后两个文件没有区别。
如果你想在补丁中一并去除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
工具兼容。
如果不了解您要处理的具体情况,很难确定为什么要这样做。我有一种感觉,您正在尝试在隔离的环境中进行受控更改,以避免影响其他用户/应用程序。
您能通过以下方式解决此问题吗:
当两个人都同意更改后,使用--reintegrate参数合并回主干并删除该分支?
这将 * 保持合并信息 * 在版本控制中识别复制/移动和更改 * 仍然隔离其他用户的更改 * 可以防止步骤2中出现不完整的更改问题,因为您可以添加更多的更改并更新。