Svn 使用Subversion,如何从一个文件中剪切并粘贴到另一个文件来保存历史

Svn 使用Subversion,如何从一个文件中剪切并粘贴到另一个文件来保存历史,svn,tortoisesvn,Svn,Tortoisesvn,现在的情况是,我花了一些时间在一些实验性的代码上乱搞。我现在想将部分代码(大约500行)移动到另一个文件中,但我不想丢失历史记录,就像我做一个简单的文本编辑器剪切粘贴一样 我所知道的最接近的方法是将代码从原始文件-svn副本中分离出来,然后从两个副本中删除不需要的内容。但我不知道如何将部分副本附加到现有文件中,从而避免历史记录同时出现在两个文件中 这一点之所以重要,基本上是因为代码非常专业,可以帮助实现一些更高级别的功能。我不希望它污染全局名称空间,所以我希望它全部放在一个文件中,在那里它将被使

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

我所知道的最接近的方法是将代码从原始文件-svn副本中分离出来,然后从两个副本中删除不需要的内容。但我不知道如何将部分副本附加到现有文件中,从而避免历史记录同时出现在两个文件中

这一点之所以重要,基本上是因为代码非常专业,可以帮助实现一些更高级别的功能。我不希望它污染全局名称空间,所以我希望它全部放在一个文件中,在那里它将被使用并包装在一个匿名名称空间中

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


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

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

svn mv
如果要在新文件中复制:

svn copy
如果两个文件都已存在:

# copy/paste with a text editor
您可以通过以下方式删除文件并保留其历史记录:

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

我认为您无法以描述的方式保存历史。SVN以文件为基础跟踪历史,不会跟踪在同一代码行上组合在一起的两个单独的文件

如果您从两个单独的文件开始,然后将它们合并为第三个文件,那么这两个文件的历史记录都将被保留。如果您将一个文件合并到另一个文件中,则其中一个文件的历史记录将“丢失”,因为您无法仅通过查看历史记录链接回“已删除”文件的历史记录


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

你可以像这样将一个文件的所有修订(或特定修订)合并到另一个文件中

svn merge sourcefile targetfile -r 0:HEAD
起初,我认为必须使用
--忽略祖先
选项(因为这两个文件不共享任何共同的历史),但显然这不是必需的。我使用SVN1.6.3进行了测试

当然,在合并结果中很可能会出现很多冲突标记。手动进行合并(如您所说的复制粘贴合并)可能更容易,然后使用
--record only
运行上面的合并命令来告诉subversion


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

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

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

不太正统,但应该可以工作…

这些都没有给我一个包含两个源文件中的文本(和历史)的文件。文本编辑器“复制/粘贴”会保留存储库中两个文件的历史记录,如果为true,则不会删除任何内容,但从中剪切的文件的历史记录会与粘贴到的文件分离。用乌龟的话来说,一切都归咎于剪贴机,而不是编码决策者。这是颠覆给你的所有工具。您可能应该使用一些DVC。Utteroimercurial适用于Windows用户。顺便说一句,我不太明白通过合并两个文件的历史记录,您希望得到什么。这没有道理。你想要什么样的回滚?您可以在文件的开头添加注释,说明这是此文件的合并,而rXXXXRollback版本中的另一个文件不是问题所在。它是关于跟踪设计决策的。日志是优秀的设计文档,解释了您做出决定的原因。查看版本之间的差异,或者查看每一行最后一次更改的原因的能力是非常宝贵的。这当然需要每个人都遵守一些规则,但我认为添加有意义的提交注释,解释每次更改的原因,在提取日志时会有所帮助。我觉得这就是答案。还没有被接受的机会-我明天会再看一看以防万一。我怀疑这不会完全符合我的要求,但我相信这是我能得到的最好的(除了svn转储黑客),所以我接受了。谢谢。你会有提交日志,但是你更改的所有行都会在“责怪”中有相同的修订标记。哇,我被纠正了。我想我对新的合并跟踪功能不太熟悉。我认为这只适用于SVN1.5+(可能是1.6+),我不喜欢那种#include用法。习惯了这是规范,这是很久以前其他语言的主体约定。这可能就是为什么我甚至没有想到这个想法的原因——但我想,考虑到一系列不完美的选择,这也没那么糟糕。这次太晚了,但总有下一次。谢谢。当然,我不建议普遍使用这种“包含”指令。但我确实使用它们来包含生成的代码:#定义_类MyClass#包含方法_Bodys.inc,方法_Bodys.inc如下所示:void THE_CLASS::generatedMethod(){…}因此,我能够生成类的一些(但不是全部)方法,而生成器不知道类的名称