2010-11-22 185 views
27

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

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

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

+2

如何是一个问题吗?使用SVN准备补丁就像准备提交一样。你运行`svn status`和`svn diff`来查看你需要的所有片段是否在那里,并*还原*,*添加*,* rm *并编辑这些文件,直到你对你的修改满意为止。 – 2010-11-22 19:20:48

+0

@Alexandre,我想要一个_scriptable_方法来捕获我的本地更改,以便我可以稍后使用info“this delta,应用于修订号XYZ”或类似的东西来重新创建工作空间的状态。 – 2010-11-23 06:28:56

回答

37

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

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

通过从一个问号开始的svn status所有线路的输出取出准备的版本的文件列表:使用xargs

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

然后,您可以通过文件的清单提交给svn add

xargs -r -d '\n' svn add < ../unversioned_files_list.txt 

然后拿出补丁:

svn diff > ../my_patch.patch 

如果你不想保留这些添加的文件,使用文件的列表unadd他们:

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

感谢亚历山大。起初,他的方法在我的情况下不起作用。我确定所有新文件在svn status中都是A,但是,diff文件仍然是空的。最后,我发现在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 

然后,回到亚历山大的解决方案,并重新加入颠覆和获得差异。

参考文献:

[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