Mercurial从本地到中央存储库提交消息

时间:2010-08-17 18:49:54

标签: version-control mercurial

我最近开始使用Mercurial,就像我对个人开发有VCS保护的方式而不检查它到中央存储库,然后当我为团队的其他成员做好准备时,我会推送到中央回购。

当我“hg commit”时,我写了一个自上次提交以来与添加相关的提交消息。在我准备将内容推送到中心之前,我可能有5个左右的本地提交。当我执行推送时,如果我没有指定修订版,我的所有本地提交及其消息都会添加到中央存储库,但我不希望使用我所有的本地小步骤来混乱中央日志。当我推送并指定本地修订时,我认为只有那个修订及其提交消息被推送,对吧?

问题是,我想推送一个提交消息,总结我所有的本地“离线”工作,因为这就是我真正添加的内容。但是,推送的提交消息是我最近编写的内容。假设我正在使用功能A,我有五个本地提交; “已添加A.1”“已添加A.2”“已清除foo.cpp中的代码”等等,以“已添加A.4”结尾。我想要登录中央存储库的是“添加A,清理了foo.cpp”但是如果我推送最后一个版本,它只会看到“已添加A.4”。现在,当我有中心更新时,我需要在推送之前在本地进行合并,我的本地提交消息是“在提示中合并”。很明显,这不是一个很好的提交消息。

这里的好习惯是什么?我不知道任何改变现有提交消息或推送新提交消息的机制。我不想对我的本地仓库进行微不足道的更改,只需在更改之前输入新的提交消息;那太傻了。我必须遗漏一些东西,因为这似乎是基本的。或者我没有考虑正确的方式?

4 个答案:

答案 0 :(得分:2)

您正在寻找Mercurial Queues扩展程序。在Mercurial:The Definitive Guide中,章节1213详细介绍了这些内容。

答案 1 :(得分:1)

我不相信Mercurial支持这种形式的功能集。最好的方法是沿着这些方向:

1)完成更改后,将“中央”存储库克隆到新文件夹 2)从原始工作存储库导出所有更改的补丁文件 3)将补丁文件导入到新克隆的pristine文件夹中 4)在新克隆的文件夹中一次提交所有更改,然后推送这些更改。

制作脚本来执行这些步骤应该不会太困难!

答案 2 :(得分:1)

当您推送并指定修订时,将推送该修订中尚未存在于其他存储库中的所有祖先。如果变更集依赖于之前的变更集,则可能是您想要的行为。

如果您想发送一个changset(并且它独立于它的祖先),您可以重新排序您的本地历史记录,因此您要发送的变更集是祖先。 histedit extension允许这样做。如果您想压缩本地更改并将它们作为单个变更集发送,您可以使用histedit将它们“折叠”在一起。

如果您想解决大量“合并”消息的问题,当您从中央存储库中取出时,可以rebase进行本地更改。结果将是您的更改成为其最新更改的父级,并且开发历史是线性的。

队列是一个(好的/流行的)解决方案,但旨在解决稍微不同的问题(维护针对另一个存储库的补丁)。当然,我说没有使用过mq扩展名。如果您真正想要的是拥有与中心历史不同的本地历史记录(例如维护所有本地消息),那么队列是我所知道的唯一解决方案。

答案 3 :(得分:1)

推送五个变更集是完全可以接受的,这将使其他人更容易查看代码。只是尝试制作逻辑上一致的变更集;我通常会尝试确保代码在每次提交后编译并通过测试。

有一些扩展程序(collapserebasehisteditmq)允许您在事后更改变更集。 collapse扩展名是您想要的:它允许您将五个本地变更集合并(合并)到一个变更集中,然后您可以将其推送到服务器。

重要的是要意识到他们是通过创建新的变更集并抛弃旧的变更集来实现的。这导致您只应在私有变更集上使用它们,即尚未与其他任何人共享的变更集。

如果你偶然设法改变已经被推送到你的中央存储库的变更集,那么这不是灾难 - 会发生的是你最终会得到原始变更集和更改后的变更集。这是因为hg push仅附加,因此您无法更改已推送到中央存储库的变更集。