在SVN diff中包含新文件

时间:2010-11-22 18:18:10

标签: svn diff patch

我有一个脚本可以构建我的应用程序,将其上传到远程计算机,在那里运行性能测试并捕获我关心的一些指标。该脚本为我在工作区中进行的本地修改创建一个补丁文件,并将其与性能编号一起显示。这有助于我比较各种调整选项的效果。如果我想在以后重新创建我的工作区,我可以使用SVN修订版号和补丁。

svn diff不会报告我添加到工作区的新文件,除非我先在其上明确使用svn add。有没有办法创建一个包含新文件的补丁文件?

PS:类似的问题被问到here但没有得到充分的回答,IMO。

2 个答案:

答案 0 :(得分:41)

要使svn diff包含本地工作副本中的所有未版本控制的文件,您必须先添加这些文件。 svn diff输出svn commit将使用的相同变更集。

如果您确定应该在此处添加所有未版本控制的文件,那就是您可以做的事情。

通过从svn status输出以问号开头的所有行来准备未版本控制文件的列表:

svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt

然后,您可以使用svn add

将该文件列表传递给xargs
xargs -r -d '\n' svn add < ../unversioned_files_list.txt

然后制作补丁:

svn diff > ../my_patch.patch

如果您不想保留这些文件,请使用文件列表取消添加:

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt

答案 1 :(得分:12)

感谢Alexandre。起初,他的方法在我的案例中不起作用。我确信所有新文件都在A中生成svn status,但是,差异文件仍为空。最后,我发现了svn status输出的差异,我的案例中的第四列都填充了+,如:

$ svn st
M      .
A  +    New.java

这意味着该项目的排程为addition-with-history [1]。这通常发生在您svn movesvn copy文件或目录[2]时。在我的例子中,New.java是来自另一个分支的svn merged,包括该分支中的先前提交历史。我们删除了这些历史信息。

首先,找到所有addition-with-history项:

svn status | grep ^A | sed -r 's/^A[ +]+//' > /tmp/add_list

(可选)删除/tmp/add_list中的目录路径,以避免在下一步中出现警告。

接下来,按svn remove删除其历史记录提交信息:

xargs -r -d '\n' svn remove --keep-local --force < /tmp/add_list

然后,回到Alexandre的解决方案,再次将它们添加到subversion并获得差异。

参考文献:

[1]http://svnbook.red-bean.com/nightly/en/svn.ref.svn.c.status.html
[2]http://www.linuxtopia.org/online_books/programming_tool_guides/version_control_with_subversion/svn.ref.svn.c.status.html