与Mercurial,我怎么能“压缩”了一系列的变更到一个前推?(With Mercurial, h

2019-06-17 18:21发布

比方说,我有一个本地和远程Mercurial库。 现在,我开始一个功能工作。 我在这工作,当我认为它这样做,我提交变更。 测试多一点,我发现我可以进一步通过调整代码中的一些改善此功能。 我做出改变和承诺。 20分钟后,我发现有一个在这个新功能中的错误,所以我解决这个问题,并承诺这一点。

我现在有3次变更,我真的想推到远程存储库为一体的变更与消息“执行功能X”,例如。

我怎样才能做到这一点,没有什么麻烦? 我相信我可以用补丁做到这一点,但似乎很多工作。

Answer 1:

如何在折叠扩展 ?



Answer 2:

histedit扩展正是你所期待的。

hg histedit -o

要么

hg histedit --outgoing

将弹出传出变更集的列表。 从列表中,可以

  • 折叠2名或更多的变更创建一个单独的变更
  • 下降的变更从历史删除它们
  • 重新排序的变更,只要你喜欢。

histedit会提示你其默认为两个消息用“\ n *** \ n”个分开它们折叠的变更的新提交消息。

您也可以使用MQ扩展了类似的结果,但它是一个很大的困难。

您也可以使用崩溃扩展只是做折叠,但它不提供尽可能好的一个UI,并且不提供一种方式来编辑生成的提交信息。 编辑生成的提交信息也允许清理最后的消息,这是我最后总是利用。



Answer 3:

是的,你可以用补丁做到这一点:让我们假设你的工作是在变更集100至110(含)

  1. 创建一个补丁:

    % hg export -o mypatch 100:110 --git

  2. 更新为99:

    % hg update 99

  3. 应用的补丁--no提交(否则你会得到所有的变更回):

    % hg import --no-commit mypatch

  4. 提交一次所有更改:

    % hg commit

  5. 现在你有两个头(110和111),它应该在他们的工作目录中产生的文件的条款等同 - 也许diff的他们剥离旧的之前的理智:

    % hg strip 100

好了,现在我已经阐明了这一切,它似乎长,但已经做了一堆次我自己,我不觉得这是太烦琐...



Answer 4:

如果您正在使用TortoiseHg,使用可以只选择了两个版本(使用CTRL选择非后续的),点击右键,选择“压缩历史”。

之后,你会得到新的头从你之前选择的第一个变化开始一个新的变化列表,它将包含您所选择的那些之间的所有后代改变列表。

你可以简单地去掉旧改名单,如果你不需要他们了:使用MQ扩展它。 再次,在TortoiseHg:右键点击需要所有它的后代被剥离,“修改历史- >地带”第一次更改名单上。



Answer 5:

我的优选使用MQ这种折叠方法是使用TortoiseHg 如这里所述 。 但是,它可以很容易地从像这样的命令行来完成:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(有可能是一个更好的方式做qfold一步,但我没有意识到这一点,因为我通常使用TortoiseHg该操作。)

乍看起来有点复杂,但一旦你使用MQ开始,这是非常简单和自然 - 再加上你可以做MQ各种其他的事情,可以很方便的!



Answer 6:

hg collapsehg histedit是最好的方式。 或者说,将是最好的方式,如果他们的工作可靠...我得到histedit三分钟内有一个堆栈转储崩溃。 Collapse是不是要好得多。

想我可能会分享另外两个BKMs:

  1. hg rebase --collapse

    这个扩展分布有水银。 我还没有与它的问题呢。 您可能需要玩一些游戏来解决hg rebase的限制-基本上,它不喜欢重订在同一个分支的祖先,命名或默认,但它允许它,如果(命名)分支之间基础重建。

  2. 移动存储库( foo/.hg )工作目录( bar )和它的文件。 不是周围的其他方法。

有些人谈到创建两个克隆的树木,并在它们之间复制文件。 或者,他们之间打补丁。 相反,它更容易移动的.hg目录。

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

这只要工作为真正的资源库中, .hg树木,是独立的工作目录及其文件。

如果它们不是独立的?



Answer 7:

我从来没有使用水银,但是这听起来很像是什么Martin Fowler的是在他的博客不是很久以前说起:

http://martinfowler.com/bliki/MercurialSquashCommit.html



Answer 8:

为什么不hg strip --keep命令?

然后你就可以提交所有更改为一个承诺。



Answer 9:

HistEdit会做你想要什么,但它可能是矫枉过正。 如果你需要的仅仅是一些变更集折叠在一起的折叠扩展将做的工作。



Answer 10:

假设你有两个未公布THISTHAT在水银承诺和他们一样加入到单个提交在THIS点::

... --> THIS --> ... --> THAT --> ... --> LAST

检查你的提交没有发表::

$ hg glog -r "draft() & ($THIS | $THAT)"

更新到LAST承诺::

$ hg up

进口承诺达THIS为MQ ::

$ hg qimport $THIS::.

不应用所有的补丁,而且只适用第一THIS ::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

与加入THAT ::

$ hg qfold $THATNAME

注意要查找名称THATNAME使用::

$ hg qseries

应用所有补丁和其移动到存储库历史::

$ hg qpush -a
$ hg qfinish -a

我的主题博客文章中加入水银两次提交 。



Answer 11:

是的, strip --keep作者的问题的作品。 但它是从别人略有不同,例如,如果从1到30有版本,但仅要崩溃版本12-15。 其他解决方案的工作,但不能strip --keep



文章来源: With Mercurial, how can I “compress” a series of changesets into one before pushing?