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

如何在Subversion中追溯分支,或者如何记录合并补丁的还原

  •  2
  • Cirdec  · 技术社区  · 15 年前

    我在一个项目上所做的部分开发无法部署,应该在一个单独的分支中完成。我已经合并了向后的更改(通过Tortoise的“Revert Changes from this Revision”和仔细编辑),撤销了本应位于单独分支中的工作,并将这个反向补丁提交给了主干。我现在想创建一个分支,其中包括在前面的补丁中撤消的更改。以下是我所做的:

    在撤消修订之前,我在修订处为新开发创建了一个新分支。

    我通过在Tortoise SVN中合并一系列修订,将撤消修订合并到新的分支中。

    我打开了更改日志,选择了“包括合并的修订”和“从此修订中还原更改”。这恢复了我工作副本中的这些更改。这就是我现在想要的树枝。我承诺了这些改变。这个提交在“包括合并的修订”下列出了撤销补丁;我不认为应该这样做;这里似乎有问题。关键可能是记录这个补丁(平方反比,或者原始修改的乘积),这样子版本就不知道创建它所执行的操作。

    然后,我通过相同的方法(合并一系列修订)将主干中的所有更改合并到新的分支中。这第二次包括了最初的撤销补丁,使我的分支与主干完全相同(现在将其作为包含的合并修订列出三次)。这不是期望的结果。

    <编辑-解决方案>

    以下是所需的行为,并且工作正常:

    首先,我创建了一个带有文件夹标签、主干、分支的空存储库。在主干中,我创建了一个包含内容(rev1)的file.txt文件:

    one
    two
    three
    

    然后将文件编辑为

    one
    two_edit
    three
    

    登记(第2版)。然后我在日志中选择了Rev2,并从该修订中选择了Revert Changes并签入(Rev3)。文件现在再次显示如下:

    一
    二
    三
    

    然后我用 Rev3 到分支\b1(rev4,was5;此步骤同时执行这两个操作)。在分支\b1中,文件如下:

    一
    二
    三
    

    然后我将rev2从主干反向合并到分支/b1,忽略祖先(rev5)。这个分支现在看起来是这样的,而现在完全巧合的是历史包含了类似的东西:

    一
    二次编辑
    三
    

    我编辑后备箱(第6版)如下:

    one
    two
    three
    four
    

    我合并 全部的 从主干变为分支/b1(第7版)。分支/b1现在正确看起来如下:

    one
    two_edit
    three
    four
    

    </编辑-解决方案>

    <编辑与编辑;

    它应该如何工作

    以下是所需的行为,如果按以下方式执行倾斜步骤,则正确工作:

    首先,我创建了一个带有文件夹标签、主干、分支的空存储库。在主干中,我创建了一个包含内容(rev1)的file.txt文件:

    一
    二
    三
    

    然后将文件编辑为

    一
    二次编辑
    三
    

    登记(第2版)。然后我在日志中选择了Rev2,并从该修订中选择了Revert Changes并签入(Rev3)。文件现在再次显示如下:

    一
    二
    三
    

    然后我创建了一个主干分支,从Rev2到Branches\b1(Rev4)。在分支\b1中,文件如下:

    一
    二次编辑
    三
    

    然后,我将主干中的rev3合并为分支\b1(rev5),分支现在看起来如下:

    一
    二
    三
    

    我编辑分支3(rev6),就好像我在这里进行分支一样。历史上也有类似的东西,这完全是巧合:

    一
    二次编辑
    三
    

    我编辑后备箱(第7版)如下:

    一
    二
    三
    四
    

    我合并 全部的 从主干变为分支/b1(第8版)。分支/b1现在看起来像:

    一
    二次编辑
    三
    四
    

    它的工作原理

    以下是实际行为;如果执行斜体化步骤,则会错误地工作,这是由于追溯分支的复杂性而必需的。错误在最后一步的第二行。

    首先,我创建了一个带有文件夹标签、主干、分支的空存储库。在主干中,我创建了一个包含内容(rev1)的file.txt文件:

    一
    二
    三
    

    然后将文件编辑为

    一
    二次编辑
    三
    

    登记(第2版)。然后我在日志中选择了Rev2,并从该修订中选择了Revert Changes并签入(Rev3)。文件现在再次显示如下:

    一
    二
    三
    

    然后我创建了一个主干分支,从Rev2到Branches\b1(Rev4)。在分支\b1中,文件如下:

    一
    二次编辑
    三
    

    然后,我将主干中的rev3合并为分支\b1(rev5),分支现在看起来如下:

    一
    二
    三
    

    在Branches\b1中,我在日志中选择了Rev5,并从该修订中选择了Revert Changes并签入(Rev6)。文件现在再次显示如下:

    一
    二次编辑
    三
    

    我编辑后备箱(第7版)如下:

    一
    二
    三
    四
    

    我合并 全部的 从主干变为分支/b1(第8版)。分支/b1现在看起来像:

    一
    二
    三
    四
    

    <编辑/GT;

    3 回复  |  直到 15 年前
        1
  •  1
  •   Bert F    15 年前

    关键可能是记录这个补丁(平方反比,或者原始修改的乘积),这样子版本就不知道创建它所执行的操作。

    我想你是在说试图阻止合并跟踪,也就是说阻止合并信息被记录在分支中。我想你可以用 svn diff svn merge --ignore-ancestry . 阅读SVN红皮书 Advanced Merging ,具体地说 Merges Without Mergeinfo Noticing or Ignoring Ancestry .

    与其从rev2分支,不如从rev3的主干创建分支,然后在rev3的分支中应用/捕获从rev1到rev2的更改,使用 矢量网差分 svn merge—忽略祖先 .

    或者,你可以看看 svn merge --record-only 为了 block a rev from future merges 也就是说,说服分支或主干您已经合并了撤消更改,这样它就不会再被应用。

        2
  •  5
  •   Christoph Strasen    15 年前

    您描述的问题(以及您的解决方案)非常常见。当然,在一个单独的分支中立即开始“不去生活”的变化会更明智,但我知道这不是我们生活的完美世界,事情也会发生变化;)。

    很明显,有了一个好的版本控制系统(如SVN),您可以随时随地进行任何更改。有多种不同的方法可以做到这一点。 所以当你为自己回答你的问题时,我自由地起草了我如何理解你的问题以及我将如何解决它。下面的图表也将用于内部目的,因此如果它不再对您有帮助,则不会造成任何伤害。

    旁注:我对乌龟不太熟悉,但我想这会比SVN命令行更容易选择樱桃(在你的例子中是反向选择樱桃)。尤其是如果您有许多分散的提交要选择。对于合并操作,我仍然更喜欢使用cli,因为它常常更清楚地了解我现在到底在做什么;)

    我希望你能把我的朋友从冲突中解放出来。

    克里斯托夫

    我们应该更聪明地在一个单独的分支中开始“不去生活”变化的发展,但我知道这不是一个完美的世界,我们生活在这个世界里,事情也在变化;)。

    很明显,有了一个好的版本控制系统(如SVN),您可以随时随地进行任何更改。有多种不同的方法可以做到这一点。 所以当你为自己回答你的问题时,我自由地起草了我如何理解你的问题以及我将如何解决它。下面的图表也将用于内部目的,因此如果它不再帮助您,则不会造成任何伤害。

    旁注:我对乌龟不太熟悉,但我想这会比SVN命令行更容易选择樱桃(在你的例子中是反向选择樱桃)。尤其是如果您有许多分散的提交要选择。对于合并操作,我仍然更喜欢使用cli,因为它常常更清楚地了解我现在到底在做什么;)

    我希望你能将我的朋友无冲突地融合在一起。

    克里斯托夫

    repository time chart

        3
  •  1
  •   Albin Sunnanbo    15 年前

    在“Tortoissesvn分支”对话框中,选择“存储库中的特定修订”,使用 按钮选择要在新分支中使用的最后一个修订。

    分支时照常进行。

    <编辑与编辑;

    我试着再现你的问题,很难理解树干里是什么,树枝里是什么,但我就是这样做的。

    首先,我创建了一个带有文件夹的空存储库 tags , trunk , branch . 在 大旅行箱 我创建了一个文件 file.txt 内容(第1版):

    one
    two
    three
    

    然后我把文件编辑到

    one
    two_edit
    three
    

    登记(第2版)。然后我在日志中选择了Rev2并选择了 revert changes from this revision 登记(第3版)。文件现在再次显示如下:

    一
    二
    三
    

    然后我创建了一个分支 大旅行箱 Rev2 branches\b1 (RV4)。 在 分支B1 文件如下:

    一
    二次编辑
    三
    

    然后我在中像这样编辑文件 大旅行箱 办理登机手续(第5版)

    one
    two
    three
    four
    

    然后我从 大旅行箱 分支B1 只拣 ReV5 和承诺(第6版)。现在 branches\b1\file.txt 看起来像这样

    one
    two_edit
    three
    four
    

    一切都如我所料被合并了。

    在这个过程中,你哪里会“出错”?

    <编辑/GT;

    推荐文章