使用Subversion,我如何从一个文件剪切并粘贴到另一个保留历史记录

时间:2009-10-13 00:27:03

标签: svn tortoisesvn

情况是我花了一些时间搞乱一些实验性代码。我现在想将部分代码 - 大约500行 - 移动到另一个文件中,但我不想丢失历史记录,就像我做一个简单的文本编辑器剪切和粘贴一样。

尽我所知如何获得将原始文件 - svn副本中的代码分开,然后从两个副本中删除不需要的东西。但我不知道如何将部分副本附加到现有文件上,保留两者的历史记录。

这个重要的原因基本上是代码只是非常专业的东西,以帮助实现一些更高级别的功能。我不希望它污染全局命名空间,所以我想在一个文件中使用它并将其包装在一个匿名命名空间中。

我意识到这听起来像将一个分支合并回主干。问题是,没有分支。实验代码并不是作为任何东西的副本开始的 - 它只是一堆从头开始的代码。我想剪切的文件和我要粘贴的文件是完全独立的文件。

我主要使用TortoiseSVN,但也安装了命令行subversion。

4 个答案:

答案 0 :(得分:17)

您可以将一个文件的所有修订版(或特定修订版)合并到另一个文件中,如此

svn merge sourcefile targetfile -r 0:HEAD

起初我以为必须使用--ignore-ancestry选项(因为两个文件不共享任何共同的历史记录),但显然这不是必需的。我用svn 1.6.3进行了测试。

您当然很可能在合并结果中获得大量冲突标记。手动合并(如你所说的那样复制和粘贴合并)可能更容易,然后使用--record-only运行上面的合并命令来告诉subversion它。

合并后,targetfile将有一个svn:mergeinfo属性,指示从sourcefile合并到哪个提交。检查targetfile的日志时,可以使用--use-merge-history选项查看这两个文件的历史记录。 TortoiseSVN在日志表单中以复选框的形式具有相同的功能。

答案 1 :(得分:4)

我认为你不能以你所描述的方式保存历史。 SVN在逐个文件的基础上跟踪历史记录,并且不会跟踪在同一代码行上组合在一起的两个单独文件。

如果您开始使用两个单独的文件然后将它们组合成第三个文件,那么将保留两者的历史记录。如果你将一个组合到另一个中,那么其中一个的历史就会“丢失”,因为你不能仅仅通过查看历史链接回到“已删除”文件的历史记录。 / p>

我想你能做的就是在提交消息中注意,其他文件中的内容被合并,然后在同一次提交中提交删除。

答案 2 :(得分:1)

如果要复制新文件并删除旧文件:

svn mv

如果要复制新文件:

svn copy

如果两个文件都已存在:

# copy/paste with a text editor

您可以删除文件并保存其历史记录:

svn del

使用SVN,您无法跟踪两个文件合并的历史记录。 您可以手动合并它并在提交消息中保留跟踪。

答案 3 :(得分:-1)

您不能将代码留在自己的文件中(在修剪您不想保留的部分之后)并将此文件包含在“真正的”源文件中吗?

// file foo.cpp:
...
namespace {
#  include "util_code.inc"
}

不太正统,但应该有效......