代码之家  ›  专栏  ›  技术社区  ›  Steve314

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

  •  13
  • Steve314  · 技术社区  · 15 年前

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

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

    这一点之所以重要,主要是因为代码只是相当专业的东西,以帮助实现一些更高级别的功能。我不希望它污染全局名称空间,所以我希望它全部放在一个文件中,在该文件中,它将被使用并包装在一个匿名名称空间中。

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

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

    4 回复  |  直到 15 年前
        1
  •  17
  •   Wim Coenen    15 年前

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

    svn merge sourcefile targetfile -r 0:HEAD
    

    一开始我以为一个人必须使用 --ignore-ancestry 选项(因为两个文件不共享任何公共历史记录),但显然这不是必需的。我用SVN 1.6.3测试过。

    当然,您很可能会在合并结果中得到很多冲突标记。手工合并(如您所说的复制粘贴合并)可能更容易,然后用 --record-only 告诉颠覆者。

    合并后, targetfile 会有一个 svn:mergeinfo 指示从哪个提交的属性 sourcefile 合并到其中。当你检查 目标文件 ,您可以使用 --use-merge-history 选择权。Tortoissesvn在日志表单的复选框形式中具有相同的功能。

        2
  •  4
  •   Ken Liu    15 年前

    我认为你不能像你描述的那样保留历史。SVN以文件为基础跟踪历史记录,它不会跟踪在同一代码行上组合在一起的两个单独文件。

    如果您从两个单独的文件开始,然后将它们组合成第三个,那么这两个文件的历史将被保留。如果您将一个文件合并到另一个文件中,那么其中一个文件的历史记录将“丢失”,从这个意义上说,您将无法仅仅从历史记录中链接回“已删除”文件的历史记录。

    我猜您可以做的是在提交消息中,只需注意另一个文件中的内容是组合在一起的,然后在同一个提交中提交删除。

        3
  •  1
  •   Natim    15 年前

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

    svn mv
    

    如果要在新文件中复制:

    svn copy
    

    如果两个文件都已存在:

    # copy/paste with a text editor
    

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

    svn del
    

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

        4
  •  -1
  •   Xavier Nodet    15 年前

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

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

    不是很正统,但应该有效…