在Mercurial中创建临时命名分支,然后将其从存在中删除

时间:2011-11-17 01:07:26

标签: mercurial branch teamcity mercurial-queue

我很想在TeamCity Visual Stuio插件中添加“Mercurial远程运行(个人构建)”功能。

从v6.5开始,TeamCity支持“远程运行分支触发器”,如果推送了与TeamCity中的触发器匹配的命名分支,则TeamCity将运行该分支的个人构建。

这个想法是从当前分支获取当前的传出变更集(比如说default),并将它们移动到名为remote-run的临时命名分支。然后将其推送到CI,以便触发个人构建,如果个人构建成功,则更改将移回原始分支,并删除remote-run分支。

我对此有几个问题:

  1. 它甚至有意义吗?
  2. 我应该使用哪个扩展程序?我相信MqExtension会做我需要的一切,但还有其他选择吗?
  3. 如果用户在远程运行期间提交其他更改,会发生什么? “临时分支”变更集如何合并回原始分支?
  4. 我目前定位的方案如下:在默认分支上工作时,用户会添加3个新修订。然后,他希望将这些更改作为TeamCity的个人构建进行运行,但是他忘了将这些修改提交给一个特别命名的分支。相反,我的插件将接受那些传出的更改,并将它们放在指定的分支中。一旦个人构建成功,那么这些更改将被放回原始(默认)分支,并推送到远程存储库。

    这样的事情:

    [default] A---B---C---D
    

    假设BCD是新版本,我希望该工具可以执行此操作:

    [default] A
               \
                [remote-run] B---C---D
    

    完成后,将其恢复到原始状态,即:

    [default] A---B---C---D
    

    编辑:我设法将更改移动到使用Mq的另一个分支,这最终变得非常简单。不幸的是,我不知道如何恢复这种变化:)

    希望这是有道理的!

2 个答案:

答案 0 :(得分:2)

成功构建后,您可以让TeamCity标记您的VCS root。如果没有单独的分支,那么在默认情况下标记每个成功的构建可能没有意义吗?

我不确定你的任务背后的动机,你想从哪个特定的工作流程中受益?

关于第3项,无法保证自动合并回到默认状态。如果存在合并冲突,那么您在构建配置中为“个人构建”添加的任何命令脚本都需要其手动操作才能让您恢复到稳定状态 - 而不是特别“CI”。

对不起,我在第一次通过时无法提供更多帮助。

答案 1 :(得分:1)

这正是'hg rebase'的命令。在你的情况下使用

hg rebase -s B -d A --detach

确保使用最新版本(最新的夜晚版本)。最近修复了一个可能影响这种情况的错误。 此外,必须启用“rebase”扩展才能使其正常工作。确保你在〜/ .hgrc(或mercurial.ini)文件中有以下行:

[extensions]
rebase = 

编辑:我似乎回答了一个相反的问题(如何删除本地分支)。要创建一个新的命名分支并将B,C,D修订版导入其中,您需要遵循以下命令序列:

hg qimport -r tip:B       #Revisions B,C,D will be imported into mq
                          #(here B is revision id of the "B" commit)
hg qpop --all             #Unapply all patches
hg branch remote-run      #Create a new branch
hg qpush --all            #Push patches into the new branch
hg qfinish -a             #Transform applied patches to regular commits