在我的设置中,我有一个中央 Hg 存储库,我正在向其推送本地更改。假设在我的本地克隆中,我有一系列本地提交,然后我想将更改推送到中央仓库。我怎样才能只推送最终状态而不包括我所做的所有“小”本地提交?
我想要这个,因为有时我不想用我所做的所有小的本地提交来污染中央回购的历史。
在我的设置中,我有一个中央 Hg 存储库,我正在向其推送本地更改。假设在我的本地克隆中,我有一系列本地提交,然后我想将更改推送到中央仓库。我怎样才能只推送最终状态而不包括我所做的所有“小”本地提交?
我想要这个,因为有时我不想用我所做的所有小的本地提交来污染中央回购的历史。
你为什么想这么做?提交小的更改可以很容易地还原某些内容。如果您在一次大提交中收集所有内容,则恢复一个小的更改可能并不容易。
我同意 bjorn(我赞成他的回答),你所做的并不是一个好主意——有意义的历史是一件好事。如果你不能被说服,那么你要做的不仅仅是推送最后一个变更集,而是一个新的变更集,它是所有这些变更集的组合。最简单的方法是使用折叠扩展,尽管 mq 甚至导出/导入都可以做到。关键在于,在将多个变更集合并为一个时,您正在重写历史记录,并且您将删除现有的变更集并用新的组合变更集替换它们。这样做违反了使 Mercurial 如此值得信赖的历史不变性。
在 mercurial wiki 页面ConcatenatingChangesets中解释了如何在没有任何扩展的情况下执行此操作。
该页面还链接到一些带有 hg 扩展的替代方法,例如CollapseExtension。
可以使用 mq 扩展重写您的历史记录。假设您要折叠的修订是 revs,5、6、7,其中 7 是小费。您可以通过以下方式完成此操作:
# Import the revs you want to collapse into mq
# mq will create patches for each revision from 5:tip, with the name
# <local rev number>.diff
hg qimport -r5:tip
# Goto the first commit
hg qgoto 5.diff
# Fold in the other commits successively. Aside from shell magic, there is
# no command line way to specify multiple patches at once.
hg qfold 6.diff
hg qfold 7.diff
# Commit the new mq patch as a changeset of its own
hg qfinish 5.diff
现在,您的存储库仅包含第 5 版,其中包含以前的第 5、6 和 7 版的内容。