2010-08-17 82 views
3

我最近开始使用Mercurial,并且像我的个人开发没有将其检入到中央存储库一样拥有VCS保护,然后在准备好某些东西时将其推送到中央回购站团队的其他成员。Mercurial提交消息从本地到中央存储库

当我“hg commit”时,我写了一个提交消息,与自上次提交以来相关的增加有关。在我准备将东西推送到中央之前,我可能会有5个左右的地方提交。当我推送时,如果我没有指定修订版本,我所有的本地提交和它们的消息都会被添加到中央存储库中,但我不想用我所有的本地小步骤混淆中央日志。当我推送并指定本地修订版时,我认为只有修订版和其提交消息被推送了,对吗?

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

这里有什么好的做法?我不知道有任何机制来更改现有的提交消息,或推送新的提交消息。我不想对本地repo进行简单的更改,只是为了在更改之前输入新的提交消息;这很愚蠢。我必须错过一些东西,因为这看起来很基本。还是我没有想过正确的方式?

回答

1

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

有一些扩展名(collapse,rebase,histedit,mq),允许您在事后更改更改集。 collapse扩展是您想要的扩展名:它允许您将五个本地变更集折叠(组合)为一个变更集,然后您可以将其推送到服务器。

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

如果您不小心设法更改已经推送到您的中央存储库的变更集,那么它不会发生灾难性 - 会发生什么情况是您最终将得到原始变更集和已更改的变更集。这是因为hg push是附加的,因此您无法更改已推送到中央存储库的变更集。

+0

我选择了这个解决方案,因为它看起来像“崩溃”真的是我正在寻找。它会允许我放弃在本地进行的任何小改进,然后在共享我的更新之前收拾一个或几个更全面的变更集。我意识到,在某些情况下,如果它不能再看到所有的小步骤,可能会削弱mercurial的合并,所以我会小心的。谢谢。 – jasper77 2010-08-18 15:17:49

1

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

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

制作脚本来完成这些步骤不应该太困难!

+0

克隆是通过SSH,所以脚本将需要互动,但它似乎像这种方法将工作。谢谢!这只是不被普遍接受的使用模式吗? – jasper77 2010-08-17 19:41:10

1

当您推送并指定一个修订版本时,该修订版本的所有祖先将不会在其他存储库中被推送。如果变更集取决于之前的变更集,那么这可能是您想要的行为。

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

如果你想解决有很多“合并”消息的问题,你可以从你的本地变更rebase当你从中央存储库拉。结果将是您的更改由他们的最新更改保留,并且发展历史是线性的。

队列是一个(好的/受欢迎的)解决方案,但旨在解决一个稍有不同的问题(维护另一个存储库的补丁)。当然,我说没有使用过mq扩展名。如果你真正想要的是本地历史与中央历史不同(例如保持所有本地消息),那么队列是我知道的唯一解决方案。

相关问题