我有一个脚本,可以构建我的应用程序,将其上传到远程机器,在那里运行性能测试并捕获一些我关心的指标。该脚本为我在工作区所做的本地修改创建了一个补丁文件,并显示它以及性能数据。这帮助我比较各种调整选项的效果。如果我想在以后的某个时间重新创建我的工作区,我可以使用SVN修订号和补丁文件。
svn diff
不会报告我添加到工作区中的新文件,除非我事先显式地对它们使用svn add
。是否有一种方法可以创建包括新文件在内的补丁文件?
附:类似的问题已经被提出这里,但在我看来没有得到充分的答复。
svn diff
包括所有本地工作副本中的未版本化文件,您必须先添加这些文件。 svn diff
输出与svn commit
使用相同的更改集。svn status
的输出中提取以问号开头的所有行,准备一个未版本化文件的列表:svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt
你可以将那个文件列表传递给xargs
,然后使用svn add
命令:
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
谢谢Alexandre。起初他的方法在我的情况下没有起作用。我确定所有新文件都标记为A
在svn status
中,但是差异文件仍然为空。最终,我发现了svn status
输出中的差异,我的情况下第四列都被+
填充,如下所示:
$ svn st
M .
A + New.java
这意味着该项目计划进行“合并历史添加”[1]。通常在您使用svn move
或svn copy
移动或复制文件或目录时发生[2]。在我的情况下,New.java
是从另一个分支svn merge
过来的,其中包括该分支中以前的提交历史记录。让我们删除这些历史信息。
首先,找到所有的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的方案中将它们重新添加到版本控制系统中,并获取差异。
参考资料:
[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
svn status
和svn diff
来查看是否所有需要的部分都在那里,并且 还原、添加、删除 和编辑文件,直到您对更改满意为止。 - Alex Jasminsvn diff --show-copies-as-adds
来实现你想要的功能,参见 https://dev59.com/qHI95IYBdhLWcg3wvgh9#2185988。 - Amos Joshua