2010-04-08 77 views
2

我被分配了项目功能的开发。我将在几周的时间内使用该功能几天。我将克隆中央回购。然后我要在当地工作3周。在这个过程中,我会多次向我的回购进展。当我完成时,我会在推动之前拉/合并/提交。如何将新功能推送至中央Mercurial回购?

什么是正确的方式推动我的功能作为一个单一的变更集中回购?我不想推动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',因为拉/合并/提交打破了我的变更序列。当然,2个变更集比15个更好,但仍然是,我宁愿有1个变更集。

</My own answer>

+0

http://stackoverflow.com/questions/1200691/with-mercurial-how-can-i-compress-a-series-of-changesets-into-one-before-pushi – 2010-04-08 14:22:27

回答

7

这是一个重复的问题,(其答案是您找到的CollapseExtension),但我会借此机会尝试脱离练习。 :)

很显然,我不是想说服你试图压缩你的变更集,但你可能想考虑版本控制的价值的一半是回答“为什么”而不仅仅是几个月和几年后的“什么”。精确地表示特征如何产生,以及在哪些阶段可能具有未来价值。放弃它似乎如此... unversioncontrolly。不要担心你的历史有多美丽,并关注它的可用性。

即使你确实崩溃,你肯定应该推动两个变更集,功能和功能的合并。合并变更集对于课程来说是相同的,不可避免的。他们有一些重要的信息,也就是他们的亲子关系,并且通过保持合并细节远离特征细节,可以很容易地使您添加的某些内容可以轻松移动到树中的其他位置。不要试图避免它们!

另外,你应该至少每晚都要推迟一些回购机器,对不对?在仅有访问权限的服务器上设置开发克隆。

+0

@ Ry4an:谢谢,我很欣赏这个建议。我想采用最佳做法。如果将中间变更集推到中央仓库没有任何问题,我会这样做。我只是不希望人们抱怨我正在污染回购。 – Sylvain 2010-04-08 16:06:23

+0

不同的项目有不同的态度,没有“错误”,但是,我宁愿“看别人的工作”,也不愿意。如果我想查看所有的三角洲组合,它只是一个'hg diff -r first -r last',但如果它们在单个变更集中,则不可能将它们分开。 – 2010-04-08 23:14:45

+0

不要将太多变化折叠成一个变更集的原因之一可能是Mercurial(或Git)的平分功能。使用二等分应该可以(半)自动找到测试失败的变更集。但是,我不知道该功能是否真正用于实际项目,但是这将成为拥有多个小变更集而不是一个包含数千LOC的变更集的原因之一,因为定位错误会更容易。就个人而言,除非存储库活动要求它(例如Linux内核),否则我会倾向于使用有用的提交消息而不是大型变更集的许多变更集。 – Energiequant 2010-04-09 17:07:59

0

我不是你为什么要推高本地之前合并您的变更昭然若揭。也许你可以通过实现一个新功能并将它作为一个变更集提交来避免将它们合并。另一方面,我的read somewhere克隆便宜,那么克隆你自己的主副本,然后当你想实现一个功能:克隆你的主副本到功能副本,实现功能,提交和推送该功能会克隆回您的本地主克隆。

当您的所有功能都在您的主克隆中时,将其推送到中央回购站。如果你的来合并变更集(我在这里假设,这不是事实),这种双重推送可能会消除丢失的变更集序列。所有这些努力看起来像是更容易提交小而且经常提交:)无论如何,

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

0

随着捆绑rebase extension,请参阅hg help rebase,--collapse选项。

请务必在做这件事之前进行备份,因为您正在重写(本地)历史记录。

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 

你觉得呢?这很复杂,但我认为它很有用。由于复杂性,我不确定我会这样做,但这是一个选项。