情况是我花了一些时间搞乱一些实验性代码。我现在想将部分代码 - 大约500行 - 移动到另一个文件中,但我不想丢失历史记录,就像我做一个简单的文本编辑器剪切和粘贴一样。
尽我所知如何获得将原始文件 - svn副本中的代码分开,然后从两个副本中删除不需要的东西。但我不知道如何将部分副本附加到现有文件上,保留两者的历史记录。
这个重要的原因基本上是代码只是非常专业的东西,以帮助实现一些更高级别的功能。我不希望它污染全局命名空间,所以我想在一个文件中使用它并将其包装在一个匿名命名空间中。
我意识到这听起来像将一个分支合并回主干。问题是,没有分支。实验代码并不是作为任何东西的副本开始的 - 它只是一堆从头开始的代码。我想剪切的文件和我要粘贴的文件是完全独立的文件。
我主要使用TortoiseSVN,但也安装了命令行subversion。
答案 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"
}
不太正统,但应该有效......