在SVN diff中包含新文件

Bin*_*mas 30 svn diff patch

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

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

PS:这里有一个类似的问题,但没有得到充分回答,IMO.

Ale*_*min 41

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

如果您确定应该在此处添加所有未版本控制的文件,那么您可以执行此操作.

通过从以svn status问号开头的所有行的输出中准备未编译文件的列表:

svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt
Run Code Online (Sandbox Code Playgroud)

然后,您可以将该文件列表传递给svn add使用xargs:

xargs -r -d '\n' svn add < ../unversioned_files_list.txt
Run Code Online (Sandbox Code Playgroud)

然后生成补丁:

svn diff > ../my_patch.patch
Run Code Online (Sandbox Code Playgroud)

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

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt
Run Code Online (Sandbox Code Playgroud)

  • 亚历山大你是坏人! (2认同)

gui*_*wuu 12

谢谢亚历山大.起初,他的方法在我的案例中不起作用.我肯定是maked所有新文件Asvn status,但是,diff文件还空着.最后,我发现了svn status输出的差异,我的案例中的第四列都填充了+,如:

$ svn st
M      .
A  +    New.java
Run Code Online (Sandbox Code Playgroud)

这意味着该项目安排在addition-with-history[1].这通常发生在您svn movesvn copy文件或目录[2]时.在我的情况下,New.javasvn merged从另一个分支,包括以前提交历史在该分支.我们删除了这些历史信息.

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

svn status | grep ^A | sed -r 's/^A[ +]+//' > /tmp/add_list
Run Code Online (Sandbox Code Playgroud)

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

接下来,删除他们的历史提交信息svn remove:

xargs -r -d '\n' svn remove --keep-local --force < /tmp/add_list
Run Code Online (Sandbox Code Playgroud)

然后,回到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
Run Code Online (Sandbox Code Playgroud)