Mercurial:如何使Repository1跟踪Repository0,但只选择某些标记的修订/更改集

时间:2012-05-25 19:55:56

标签: mercurial

使用Mercurial。在私人克隆中工作,做出改变,推动掌握。等等。没关系。

(顺便说一句,让我说我熟悉许多版本控制系统,从经典的SCCS,RCS,CVS,SVN到DVCS,如BitKeeper,Git,Mercurial,熟悉Monotone,Darcs,Bzr。如此熟悉Perforce,......我只是提到了能够解释系统之间等价和相似之处的人。)

不幸的是,该项目的其他成员认为我经常办理登机手续。我使用“早期检查和经常检查”的方法,有时每半小时检查一次。他们不希望在日志中看到如此多的签入消息。

不是问题:现在,我已经养成了在分支上进行大部分更改的习惯(虽然hg缺少追溯分支),总结了我将任务分支合并回主干时的所有更改。 hg log -b default允许他们过滤掉我的任务分支,并且当合并消息有意义时可以正常工作。这不是我的问题。

不是问题:类似地,我知道如何使用历史编辑等来删除我的精细粒度变化集,以便推动的唯一变更集是粗粒度。 (顺便说一下,我经常发现最简单的事情就是移动.hg目录。)历史编辑很烦人,但我可以做到。

我的问题:我的问题是:希望跟踪我的细粒度变更集和日志消息,即使我没有将它们推送到项目主存储库。      问:我该怎么做?

即。如何让两个存储库相互跟踪,但不要将所有更改都推送到主服务器?优选地,不推送标签改变图。 (顺便说一句,我更喜欢说“标记修订版集”。变更集听起来太像补丁了。)

我现在的方式就是拥有 a)项目主回购 b)我的个人主仓库,所有的细粒度变化 c)一个或多个工作空间

其中

a)克隆项目主仓库以获取工作区(使用hg clone,yyeah,我知道)

b)在工作区克隆中使用细粒度签到(我知道这个)

c)从工作区克隆推送到我的个人主人

d)并且,当需要推送到主人时,编辑历史记录,并推送它。

两个麻烦:

1)冲突从工作区克隆合并或推送到我的个人主服务器 - 更确切地说,从主仓库与历史编辑合并以删除精细纹理签到时的冲突,以及保留了精细纹理签到的我的个人主人。

2)我想在我的个人主人中记录推送给项目主人的内容。

-

一个非常简单的例子。

任务分支,细粒度签名。

o  changeset:   1022:
|  branch:      default
|  parent:      1017
|  parent:      1021
|  summary:     Merged task branch onto main, default, branch, with changes to FOO and BAR
|
o    changeset:   1021
|\   branch:      task-branch
| |  parent:      1020
| |  summary:     Merged default branch to task-branch, with changes to FOO and BAR
| |
| o  changeset:   1020
| |  branch:      task-branch
| |  parent:      1018:
| |  summary:     yet another fine grain checkin on a branch changing BAR for a second time
| |
o |  changeset:   1019
| |  branch:      task-branch
| |  parent:      1018:
| |  summary:     yet another fine grain checkin on a branch changing FOO
| |
o |  changeset:   1018
| |  branch:      task-branch
| |  parent:      1017
| |  summary:     yet another fine grain checkin on a branch changing BAR a first time
| |
|/
o  changeset:   1017
|  branch:      default
|  summary:     some other changeset on the default branch, i.e. trunk
|

已编辑的历史记录,将被推送到项目主文件

o  changeset:   1018: ...changed checksumm because checksum seems to include history
|  branch:      default
|  parent:      1017
|  summary:     Merged task-branch onto main, default, branch, with changes to FOO and BAR. 
|               Removed task-branch-history from what got pushed to project repo, 
|               although may still be in personal repo
|
o  changeset:   1017
|  branch:      default
|  summary:     some other changeset on the default branch, i.e. trunk
|

问题是,当我尝试合并更新的projecvt master时,可能看起来像

o  changeset:   1019
|  branch:      default
|  parent:      1018
|  summary:     again, some other changeset on the default branch, i.e. trunk
|
o  changeset:   1018: ...changed checksumm because checksum seems to include history
|  branch:      default
|  parent:      1017
|  summary:     Merged task-branch onto main, default, branch, with changes to FOO and BAR. 
|               Removed task-branch-history from what got pushed to project repo, ]
|               although may still be in personal repo
|
o  changeset:   1017
|  branch:      default
|  summary:     some other changeset on the default branch, i.e. trunk
|

我遇到了冲突,即使项目主数据的变更集1018和个人主数据中的1022在文件内容方面完全相同。

我尝试过不改变推送合并changesrt中的注释。没有帮助,至少不可靠。

我想知道完整的历史是否包含在变更集中。

我也想知道是否有一些合并工具可以识别相同的文件,即使历史记录和日志消息不同。

1 个答案:

答案 0 :(得分:3)

通常,任何涉及编辑历史记录的工作流程都不会很好。这不是预期的工作模式,也没有努力使其运作良好。

更好的选择可能是:

  1. 版本化的Mercurial队列(hg qinit --create-repo),它允许您在单个补丁上进行多次提交迭代。您可以在私人补丁回购中获得完整的历史记录,并且只获得qfinish整数。
  2. 不是将您的任务分支合并回来并编辑历史记录,而是将更改重新应用为单个提交并推送它。在您的示例中,它将是hg diff -r 1017 -r 1021 | hg import,它创建一个新提交(1022),它是所有更改1018 :: 1021(包括端点)的总和。 应该干净地合并并且可以推送,而不必将task-branch上的任何更改集推送给他们。您甚至可以在任务分支上hg commit --close-branch
  3. 告诉你的同事STFU。 ;)高变更集粒度是一种很好的实践,它们应该适应。
  4. 另外,请考虑为任务分支使用书签而不是命名分支。同样,新的phases功能可以将任务分支中的更改集(无论是书签分支还是旧式命名分支)标记为secret,这样就不会意外推送它们。