我有一个脚本可以构建我的应用程序,将其上传到远程计算机,在那里运行性能测试并捕获我关心的一些指标。该脚本为我在工作区中进行的本地修改创建一个补丁文件,并将其与性能编号一起显示。这有助于我比较各种调整选项的效果。如果我想在以后重新创建我的工作区,我可以使用SVN修订版号和补丁。
svn diff
不会报告我添加到工作区的新文件,除非我先在其上明确使用svn add
。有没有办法创建一个包含新文件的补丁文件?
答案 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 move
或svn 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