Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将新功能推送到中央Mercurial回购?_Mercurial_Workflow_Dvcs - Fatal编程技术网

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

如何将新功能推送到中央Mercurial回购?,mercurial,workflow,dvcs,Mercurial,Workflow,Dvcs,我被指派为一个项目开发一个特性。我打算在几周的时间里,花几天的时间来研究这个特性。我将克隆中央回购协议。然后我将在当地工作三周。在这个过程中,我会多次向回购协议提交我的进度。当我完成后,我将在推之前拉/合并/提交 将我的功能作为单个变更集推送到中央回购的正确方法是什么?我不想将14个“正在工作”变更集和1个“合并”变更集推送到中央回购。我希望项目中的其他合作者只看到一个带有重要提交消息的变更集(例如“实现的特性ABC”) 我是Mercurial和DVCS的新手,因此如果您认为我的方法不正确,请毫

我被指派为一个项目开发一个特性。我打算在几周的时间里,花几天的时间来研究这个特性。我将克隆中央回购协议。然后我将在当地工作三周。在这个过程中,我会多次向回购协议提交我的进度。当我完成后,我将在推之前拉/合并/提交

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

我是Mercurial和DVCS的新手,因此如果您认为我的方法不正确,请毫不犹豫地提供指导

到目前为止,我提出了一种将15个变更集减少为2个变更集的方法。假设变更集10到24是“正在进行的工作”变更集。我可以
'hg collapse-r 10:24-m“Implemented feature ABC”
(14个变更集折叠成1个)。然后,我必须
'hg pull'
+
'hg merge'
+
'hg commit-m“与最近的更改合并”
。但现在我被2个变更集所困扰。我不能再
'hg collapse'
,因为pull/merge/commit破坏了我的变更集序列。当然,2个变更集比15个好,但我还是希望有1个变更集


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

另一方面,我认为克隆是便宜的,那么,当您想要实现一个功能时,如何将自己克隆为一个主副本呢:将您的主副本克隆到一个功能副本,实现该功能,提交并将该功能克隆推回到您的本地主克隆

当您的所有功能都在主克隆中时,将其推送到中央repo。如果您必须合并变更集(我在这里假设,这不是事实),这种双重推送可能会消除丢失的变更集序列。不管怎样,所有这些努力似乎都更容易做到“小规模”和“经常”的承诺:)


较小的提交也会减少代码在合并过程中出错的可能性。

这是一个重复的问题(其答案是您找到的CollapseExtension),但我将借此机会尝试说服您放弃此做法。:)

显然,我不想让你去尝试压缩你的变化集,但是你可能会想,版本控制的价值一半是回答“为什么”,而不是“几年后”。一个功能是如何产生的,以及在什么阶段的准确表示可能具有未来价值。丢弃它似乎是如此。。。大学控制。不要担心你的历史有多美好,而要关注它有多有用

即使你真的崩溃了,你也应该推动两个变更集,特性和特性的合并。合并变更集是该过程的标准,不可避免。他们有一些非常重要的信息,即他们的亲子关系,并且通过将合并细节排除在功能细节之外,使您添加的功能可以轻松地移动到树中的其他位置。不要试图避开他们

另外,你应该至少每晚从你的机器上推出一些回购协议,对吗?在服务器上设置一个只有您访问的开发克隆或其他东西。

使用捆绑包,请参阅hg帮助重新设置基础,--collapse选项


不过,在重写(本地)历史记录之前,请确保进行备份。

我是OP。我使用找到了另一个解决方案

工作流程将是:

// 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 //克隆,启用它。 hg克隆… hg-qinit-c //创建新队列 hg qnew-m“工具特性ABC”特性ABC //工作并提交到队列repo 在功能上工作 hg-qrefresh hg qcommit-m“在制品” //工作并提交到队列repo 在功能上工作 hg-qrefresh hg qcommit-m“在制品” //工作并提交到队列repo 在功能上工作 hg-qrefresh hg qcommit-m“在制品” //现在,我准备好集成了 hg qpop//删除我的补丁 hg pull-u//从中央回购中获取变更集 hg qpush//重新应用修补程序, 进行一些测试和最终调整 hg qrefresh//重新贴上贴片 hg qfinish-a//冻结补丁更改集 hg push//push-to-central作为单个变更集
你觉得怎么样?这很复杂,但我认为它有效。由于复杂性,我不确定我是否会这样做,但这是一个选择。

可能重复@Ry4an:谢谢,我感谢你的建议。我想采用最佳实践。如果将中间变更集推送到中央回购协议没有错,我会这么做。我只是不想让人们抱怨我污染了回购协议。不同的项目有不同的态度,没有“错”,但是的,我宁愿“看别人的作品”也不愿不看。如果我想看到所有的增量合并,只需“hg diff-r first-r last”即可,但如果它们在一个变更集中,就不可能将它们拆分回去。不将太多变更合并到一个变更集中的一个原因可能是Mercurial(或Git)的对分功能。使用对分,应该可以(半)自动定位测试失败的变更集。然而,我不知道这个特性是否真的在实际项目中使用,但这将是拥有多个小变更集而不是一个包含数千个LOC的变更集的原因之一,因为定位bug会更容易。就个人而言,我更喜欢具有有用提交消息的许多变更集,而不是大型变更集,除非存储库活动需要(例如Linux内核)。