如何将新功能推送到中央Mercurial回购?

时间:2010-04-08 12:25:11

标签: mercurial workflow dvcs

我分配了项目功能的开发。我将在几周的时间内完成该功能几天。我将克隆中央回购。然后我要去当地工作3个星期。在这个过程中,我会多次将我的进展交给我的回购。当我完成之后,我会在推动之前进行拉/合并/提交。

将我的功能作为单个变更集推送到中央仓库的正确方法是什么?我不想将14个“正在进行中的工作”变更集和1个“合并”变更集推送到中央仓库。我希望项目中的其他协作者只能看到一个带有重要提交消息的变更集(例如“已实现的功能ABC”)。

我是Mercurial和DVCS的新手,如果您认为我没有以正确的方式接近,请不要犹豫提供指导。

<My own answer>

到目前为止,我想出了一种方法,将15个变更集减少到2个变更集。假设变更集10到24是“正在进行中”变更集。我可以'hg collapse -r 10:24 -m "Implemented feature ABC"'(14个变更集合并为1)。然后,我必须'hg pull' + 'hg merge' + 'hg commit -m "Merged with most recent changes"'。但现在我坚持使用2个变更集。我不能再'hg collapse',因为pull / merge / commit破坏了我的变更集序列。当然,2个变更集比15个更好但是,我宁愿有1个变更集。

</My own answer>

4 个答案:

答案 0 :(得分:7)

这是一个重复的问题,(你的回答是你找到的CollapseExtension),但我会借此机会试着说服你。 :)

很明显,我不是在试图压缩你的变更集而告诉你的地方,但你可能想要考虑版本控制的一半价值是回答“为什么”而不仅仅是几个月后的“什么”。准确表示特征是如何产生的,以及在什么阶段,可能具有未来价值。抛弃它似乎是......无法控制的。不要担心你的历史有多漂亮,而要关注它的实用性。

即使你崩溃了,你肯定应该推动两个变更集,功能和功能的合并。合并变更集是课程的标准,不可避免。他们有一些非常重要的信息,即他们的父母,并且通过保持合并详细信息,可以很容易地使您添加的内容可以轻松地移动到树中的其他位置。功能细节。不要试图避免它们!

另外,你应该至少每晚推动机器上的一些回购,对吗?在只有您访问的服务器上设置开发克隆。

答案 1 :(得分:0)

我不太清楚为什么要在推送之前在本地合并您的变更集。也许您可以通过实现新功能并将其作为一个变更集提交来避免合并它们。

另一方面,我read somewhere克隆是便宜的,那么如何克隆自己的主副本,然后当你想要实现一个功能时:将主副本克隆到功能副本,实现功能,提交并将功能克隆推送回本地主克隆。

当您的主要克隆中包含所有功能时,将其推送到中央存储库。如果你来合并变更集(这假设在这里,这不是事实),这种双推可能会让你摆脱丢失的变更集序列。所有这些努力看起来似乎更容易承诺小而且经常提交,无论如何:)

较小的提交也会使代码在合并期间不太可能出错。

答案 2 :(得分:0)

使用捆绑的rebase extension,请参阅hg help rebase,--collapse option。

在执行此操作之前,请务必进行备份,因为您正在重写(本地)历史记录。

答案 3 :(得分:0)

我是OP。我找到了使用Mq extension的其他解决方案。

工作流程将是:


// Clone, enable qinit.
hg clone …
hg qinit -c

// Create new queue
hg qnew -m "Implement feature ABC" FeatureABC

// Work and commit to the queue repo
work on feature
hg qrefresh
hg qcommit -m "wip"

// Work and commit to the queue repo
work on feature
hg qrefresh
hg qcommit -m "wip"

// Work and commit to the queue repo
work on feature
hg qrefresh
hg qcommit -m "wip"

// Now, I'm ready to integrate
hg qpop        //remove my patch
hg pull -u     // get changesets form central repo
hg qpush       // reapply patch, 
do some testing and final adjustments
hg qrefresh    //reapply the patch
hg qfinish -a  // freeze the patch changeset

hg push // push to central as a single changeset
你怎么看?这很复杂,但我认为它有效。由于复杂性,我不确定我会这样做,但这是一个选择。