在Mercurial仓库之间移动未完成的代码

3

我在桌面电脑上检查了代码库并对其进行了一些工作。现在我要离开,希望在我的笔记本电脑上看到这些更改。

一个解决方案是简单地提交未完成的代码,然后在我的笔记本电脑上拉取它们。但这就意味着我在存储库中有无法编译的代码,这是我想避免的。

怎么处理才是最好的方式?生成和应用补丁?使用hg serve来移动不完整的更改?

4个回答

4
以下是三种方法。我将讨论每种方法的优缺点:
选项1:使用“hg diff”获取显示未提交更改的差异文件,然后在接收端上使用“hg import --nocommit”应用这些更改而不创建新的变更集。
优点:简单,不创建变更集。
缺点:实际上不使用Mercurial作为DVCS。可能无法捕捉新添加的文件。
选项2:在发送端提交,推送到接收端(或从接收端拉取,或将“hg bundle”放在闪存驱动器上),绕过工作服务器,在接收端上更新,然后在两个方面上进行“hg rollback”以消除变更集(但保留更改)。
优点:使用推送和拉取移动更改,就像Mercurial意图的那样。
缺点:Hacky。依赖于仅适用于1级深度的回滚。意外地拉取两次,您无法撤消第一次。
选项3:在发送端提交。将其推送到只有您可以访问的开发人员存储库中,并在接收端上进行拉取。在构建完成之前不要将其推送到公司存储库,但是当您推送所有中间存储集时,请将其推送。
优点:正是DVCS所关心的内容。您的工作顺序得到记录和保留。
缺点:需要设置一个仅限于您的克隆。
顺便说一句,我推荐选项3。每个开发人员的存储库正是DVCS所关心的内容。如果您的公司不方便在可以从家中和外部访问的服务器上设置存储库,请向他们指出记录了将开发人员带到完成修复/功能的过程的巨大价值,并且鼓励开发人员经常推送到不需要编译的存储库对于每日备份很有好处。
最后,在完成功能或修复后,您始终可以折叠所有中间存储集。我不喜欢这样做(我是一个“展示你的工作”的人),但是这里是如何操作:Can I squash commits in Mercurial?

选项4,针对高级用户:共享MQ队列。 - tonfa
这正是我想要的答案。因为我已经设置了自己的存储库,所以将选择选项3。我只是在考虑历史记录中是否有损坏(无法编译)的变更集而感到有些困惑。我认为合并变更集不是一个好主意,因为存储库是公开的(我没有尝试隐藏它),某人可能已经克隆了它,因此我应该保留历史记录不变。 - Mizipzor
mizipzor,我认为你做出了正确的选择。尽管重写历史是一种完全有效的工作模式,但它总让人感到不舒服。有点像用铅笔而不是钢笔做科学实验。 - Ry4an Brase

1
嗯...如果你想让“head”干净,那么(我可能对Hg的术语不太熟悉,在SVN中做得不够多):
在当前一轮更改之前分支,将你当前的工作即不能构建的内容放在分支上,将更改提交到分支上,将分支拉到笔记本电脑上,去玩耍,回来后将所有内容合并在一起(这应该相当容易,因为“head”不会改变),如果你真的想要的话,就删除分支!
我已经看到过几次类似的变化“顺便提及”的写法 - 总是被认为是DVCS“更好”的原因,尽管我可能需要整天才能找到一个例子 )-:

或者(再思考一下 - 并允许我更多地使用SVN)- 关键在于我可以提交所有我想要的内容到我的本地“WIP”存储库,无论是破损的代码还是不完整的代码,因此我可以安全地将我的当前WIP拉取(或推送)到笔记本电脑上并返回。需要保持干净(始终构建)的存储库是“服务器”存储库,因此虽然我可以在本地提交,但我不会将其推送到那个存储库 - 服务器存储库 - 直到一切都好...(那个“服务器”存储库将触发构建服务器等)。我怀疑后者更接近我看到的大多数例子的描述。


0

这可能被视为不文明的,但我经常使用rsync通过SSH移动“正在进行中”的存储库,直到我达到值得提交的地步。


0

另一个很酷的选项(但需要更多的操作)是将未完成的更改放入 MQ 中(首先启用 mq 扩展),并对 MQ 进行版本控制(qinit -c)。然后,使用 qcommit 提交补丁队列的当前状态,并通过拉取和推送 MQ 来同步未完成的工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接