在 SVN diff 中包含新文件

33

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

svn diff不会报告我添加到工作区中的新文件,除非我事先显式地对它们使用svn add。是否有一种方法可以创建包括新文件在内的补丁文件?

附:类似的问题已经被提出这里,但在我看来没有得到充分的答复。


2
这有什么问题吗?使用 SVN 准备补丁就像准备提交一样。您运行 svn statussvn diff 来查看是否所有需要的部分都在那里,并且 还原添加删除 和编辑文件,直到您对更改满意为止。 - Alex Jasmin
@Alexandre,我想要一种可编写脚本的方法来捕获我的本地更改,以便我可以在以后重新创建工作区状态,并使用类似于“这个增量应用于修订号XYZ”的信息。 - Binil Thomas
你可以尝试使用 svn diff --show-copies-as-adds 来实现你想要的功能,参见 https://dev59.com/qHI95IYBdhLWcg3wvgh9#2185988。 - Amos Joshua
2个回答

45
为了让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,看起来这可能会奏效。我会尝试一下并回来。 - Binil Thomas
我找不到比Denis更好的措辞来祝贺你。 :-) - Michaël Le Barbier
这是一个非常棒的答案! - Oscar Jara
请注意,在 Mac 上应该使用 'sed -E'。 - ajfbiw.s

14

谢谢Alexandre。起初他的方法在我的情况下没有起作用。我确定所有新文件都标记为Asvn status中,但是差异文件仍然为空。最终,我发现了svn status输出中的差异,我的情况下第四列都被+填充,如下所示:

$ svn st
M      .
A  +    New.java

这意味着该项目计划进行“合并历史添加”[1]。通常在您使用svn movesvn 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接