使用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中的注释。没有帮助,至少不可靠。
我想知道完整的历史是否包含在变更集中。
我也想知道是否有一些合并工具可以识别相同的文件,即使历史记录和日志消息不同。
答案 0 :(得分:3)
通常,任何涉及编辑历史记录的工作流程都不会很好。这不是预期的工作模式,也没有努力使其运作良好。
更好的选择可能是:
hg qinit --create-repo
),它允许您在单个补丁上进行多次提交迭代。您可以在私人补丁回购中获得完整的历史记录,并且只获得qfinish
整数。hg diff -r 1017 -r 1021 | hg import
,它创建一个新提交(1022),它是所有更改1018 :: 1021(包括端点)的总和。 应该干净地合并并且可以推送,而不必将task-branch
上的任何更改集推送给他们。您甚至可以在任务分支上hg commit --close-branch
另外,请考虑为任务分支使用书签而不是命名分支。同样,新的phases功能可以将任务分支中的更改集(无论是书签分支还是旧式命名分支)标记为secret
,这样就不会意外推送它们。