2009-10-13 66 views
11

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

就像我知道如何将代码从原始文件中分离出来 - svn copy,然后从两个副本中删除不需要的东西。但我不知道如何将该部分副本附加到现有文件上,并保留两者的历史记录。

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

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

我大多使用TortoiseSVN,但也安装了命令行subversion。

回答

16

您可以合并一个文件的所有版本(或者特定版本)到另一个像这样

svn merge sourcefile targetfile -r 0:HEAD 

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

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

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

+0

这很聪明。 – 2009-10-13 15:46:30

+0

我怀疑这不会完全符合我的要求,但我相信这是我将获得的最好结果(缺少svn dump hacking),所以我接受。谢谢。 – Steve314 2009-10-13 16:59:40

+0

您将拥有提交日志,但您所做的更改中的所有行在“责任”中都有相同的修订标记。 – 2009-10-14 15:27:57

1

如果你想在一个新的文件复制和删除旧文件:

svn mv 

如果你想在一个新的文件复制:

svn copy 

如果这两个文件已存在:

# copy/paste with a text editor 

您可以删除一个文件并保留其历史记录:

svn del 

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

+0

这些都不给我包含来自两个源文件的文件文本(历史)。文本编辑器复制/粘贴保留了存储库中的两个历史记录,true - 任何内容都不会被删除 - 但是您从中删除的文件的历史记录将从您粘贴的文件中分离出来。在TortoiseSVN术语中,责备将所有内容归咎于剪贴画,而不是对作出编码决定的人进行责备。 – Steve314 2009-10-13 00:53:39

+0

它是Subversion给你的所有工具。你应该使用一些DVCS。 TortoiseMercurial适用于Windows用户。 – Natim 2009-10-13 01:06:24

+0

顺便说一句,我不明白你期望合并两个文件的历史。它没有任何意义。你有什么样的回滚?您可以在文件的开始处添加注释,以表示它是合并此文件与修订版中的另一个文件rXXXX – Natim 2009-10-13 01:08:34

4

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

如果您从两个单独的文件开始,然后将它们组合成第三个文件,那么两者的历史记录将保留。如果将一个人与另一个人结合起来,那么他们中的一个人的历史将会“失去”,因为仅仅通过查看历史,您将无法链接回“已删除”文件的历史记录。

我想你可以做的是在提交消息中,只需注意来自其他文件的内容被合并,然后在同一提交中提交删除。

+0

我有一种感觉,那就是答案。在机会不被接受的情况下 - 明天我会再看一次以防万一。 – Steve314 2009-10-13 01:31:40

-1

你不能把代码保留在它自己的文件中(在修剪你不想保留的部分之后),并将这个文件包含到你的“真实”源文件中吗?

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

不是真的正宗,但应该工作...

+0

我不喜欢那种#include使用的风格。习惯了这种规范,很久以前就是其他语言中的身体惯例。这可能就是为什么这个想法甚至不会发生在我身上 - 但是,考虑到一系列不完美的选择,我认为这并不坏。这一次太迟了 - 但总是会有下一次。 – Steve314 2009-10-15 08:58:25

+0

谢谢。我当然不会推荐一般使用这种#include指令。但我没有用它们来包括生成的代码: 的#define MyClass的the_class的的#include method_bodies.inc 与method_bodies.inc看起来像这样: 无效:: the_class的generatedMethod(){ ... } 因此,我能够在没有生成器知道类名的情况下生成一些类但不是全部的方法。 – 2009-10-15 09:23:29

相关问题