几个月前,我将Subversion存储库转换为Mercurial,最后我在修订历史中留下了两个毫无意义的空白。我试图弄清楚是否可以弥补差距,但是我还没有获得能够准确完成我想要的工具的工具。

在项目的初期,我已经对Subversion仓库进行了两次重组:首先将单个项目的根目录转换为主干/分支/标签布局,然后在第二个根文件夹中添加第二个相关项目,并使用其自己的主干/分支/标签。

当我决定改用Mercurial时,除了第一个原始项目的主干外,没有任何重要的开发 Activity 。我能够使用Mercurial转换实用程序和路径映射在新的Mercurial存储库中重新组合一个明智的主干,或者我想。

现在我意识到我有两个额外的负责人,每个人都对应于更改历史记录从头开始的地方:

r0 ... r16 | (r17) r18 ... r61 | (r62) r63 ... tip

中断后的两个修订的结果r17和r62与中断前的相应修订的内容相同-它们完全由文件添加操作组成,其内容与先前的修订完全相同。有意义的更改仅从下一个修订版开始(分别为r18和r63)。

为了使r17和r62拼接起来,我搞砸了Mercurial Transplant扩展程序,但是最后将拼接的变更集串联到默认分支的尖端(此时为r405)。

这些多余的头脑并没有真正伤害到我的开发 Activity ,所以我让它走了一段时间。促使我解决此问题的原因是,每次我从远程存储库中提取时,MercurialEclipse都会提示这些额外的问题。

谁能提供任何有关如何解决此问题的建议?我只是在错误地获得命令标志,还是我使用了错误的工具?我应该改用Rebase扩展程序吗?我们都曾经使用过Subversion的某种dump-edit dumpfile-reload过程怎么样?

当我将项目发布到开发服务器时,那里只有几个克隆,因此销毁这些副本并重新克隆并不是什么大问题。

最佳答案

扩展命令 rebase collapse 应该可以解决问题。以以下小型存储库为例:

$ hg glog -p

o  changeset:   3:bc701d12d956
|  tag:         tip
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello world
|  +hello big world
|
o  changeset:   2:2bb8c95d978e
   parent:      -1:000000000000
   summary:     history breaking svn reorganization

   diff --git a/file b/file
   new file mode 100644
   --- /dev/null
   +++ b/file
   @@ -0,0 +1,1 @@
   +hello world

@  changeset:   1:b578b2ec776b
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello
|  +hello world
|
o  changeset:   0:c3d20f0b7072
   summary:     initial

   diff --git a/file b/file
   new file mode 100644
   --- /dev/null
   +++ b/file
   @@ -0,0 +1,1 @@
   +hello

它基本上类似于您的情况,即有两个不相关的历史记录行,其中第二行(r2)的第一个修订版是第一行(r1)的最后一个修订版中所有内容的简单补充。

您可以使用 rebase 将第二行放在第一行:
$ hg rebase -s 2 -d 1
$ hg glog

@  changeset:   3:020d1b20caa8
|  summary:     hack
|
o  changeset:   2:2a44eb4b74c3
|  summary:     history breaking svn reorganization (empty changeset now)
|
o  changeset:   1:b578b2ec776b
|  summary:     hack
|
o  changeset:   0:c3d20f0b7072
   summary:     initial

如您所见,这两行已经合并。修订版2现在是一个过时的空白变更集。您可以通过使用 collapse 命令合并修订版1和2来摆脱它:
$ hg collapse -r 1:2
<edit commit message>
$ hg glog -p

@  changeset:   2:d283fe96a5e6
|  tag:         tip
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello world
|  +hello big world
|
o  changeset:   1:c486d8191bf0
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello
|  +hello world
|
o  changeset:   0:c3d20f0b7072
   summary:     initial

   diff --git a/file b/file
   new file mode 100644
   --- /dev/null
   +++ b/file
   @@ -0,0 +1,1 @@
   +hello

现在,不相关的历史线以有意义的方式结合在一起。

关于mercurial - 在Mercurial储存库时间轴中拼接不连续性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5149621/

10-15 18:10