拼接Mercurial存储库时间轴中的不连续性

bpa*_*lla 7 mercurial dvcs rebase

几个月前我将一个Subversion存储库转换为Mercurial,最终我在修订历史中留下了两个毫无意义的空白.我想知道我是否可以拼凑出差距,但我无法让工具完全按照我的意愿去做.

我在项目的早期两次重组了Subversion repo:首先将单个项目根转换为trunk/branches/tags布局,然后在第二个根文件夹中添加第二个相关项目,并使用它自己的trunk/branches /标签.

当我决定切换到Mercurial时,在第一个原始项目的主干之外没有重大的开发活动.我能够使用Mercurial转换实用程序和路径映射来重新组合新的Mercurial存储库中的单个敏感主干,或者我认为.

现在我意识到我有两个额外的头,每个头对应于更改历史基本上从哪里开始:

r0 ... r16 | (r17) r18 ... r61 | (r62) r63 ... tip
Run Code Online (Sandbox Code Playgroud)

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

我试图将r17和r62拼接在一起,但是它会在默认分支的顶端(此时为r405)连接拼接变换集.

这些额外的头脑并没有真正伤害我的开发活动,所以我已经放了一段时间.推动我解决这个问题的原因是,每当我从远程存储库中取出时,MercurialEclipse会抱怨这些额外的头部.

任何人都可以就如何处理此问题提出任何建议吗?我只是错误地命令标志,或者我使用了错误的工具?我应该使用Rebase扩展吗?那些我们以前用Subversion做的dump-edit dumpfile-reload过程怎么样?

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

Obe*_*nne 5

扩展命令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
Run Code Online (Sandbox Code Playgroud)

它基本上类似于你的情况,即有两条不相关的历史记录,其中第二行(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
Run Code Online (Sandbox Code Playgroud)

如您所见,两条线已经连接在一起.修订版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
Run Code Online (Sandbox Code Playgroud)

现在,不相关的历史路线以有意义的方式加入.