gpt4 book ai didi

mercurial - 拼接 Mercurial 存储库时间线中的不连续性

转载 作者:行者123 更新时间:2023-12-04 12:24:43 25 4
gpt4 key购买 nike

几个月前,我将一个 Subversion 存储库转换为 Mercurial,结果在我的修订历史中留下了两个毫无意义的空白。我试图弄清楚我是否可以拼接间隙,但我一直无法让工具精确地完成我想要的。

在项目的早期,我曾两次重组 Subversion 存储库:首先将单个项目根转换为主干/分支/标签布局,然后在第二个根文件夹中添加第二个相关项目,并使用它自己的主干/分支/标签。

当我决定切换到 Mercurial 时,除了第一个原始项目的主干之外,还没有任何重大的开发事件。我能够使用 Mercurial 转换实用程序和路径映射在新的 Mercurial 存储库中重新组装单个合理的主干,或者我是这么认为的。

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

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

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

我尝试过使用 Mercurial Transplant 扩展来拼接 r17 和 r62,但它最终将拼接的变更集一直连接到默认分支的顶端(此时为 r405)。

这些额外的头并没有真正损害我的开发事件,所以我已经暂时放弃了。促使我解决这个问题的是,每次我从远程存储库中提取时,MercurialEclipse 都会提示这些额外的头。

任何人都可以就如何解决这个问题提供任何建议吗?是我弄错了命令标志,还是我使用了错误的工具?我应该改用 Rebase 扩展吗?我们曾经在 Subversion 中使用的某种转储编辑转储文件重新加载过程怎么样?

虽然我已将项目发布到我的开发服务器,但那里只有几个克隆,因此销毁这些副本并重新克隆应该没什么大不了的。

最佳答案

扩展命令 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

如您所见,两条线已 merge 。修订版 2 现在是一个过时的空变更集。您可以使用 collapse 摆脱它。 merge 修订版 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com