如何在存储库中交换Mercurial队列

时间:2009-06-09 15:10:32

标签: mercurial mercurial-queue

我有一个名为“模拟器”的平台中立的mercurial代码仓库

并希望在构建之前应用针对特定平台优化的修补程序。

根据指南,我们可以通过使用带防护装置的补丁来实现这一目标。

  • Windows Experimental.patch + windows
  • Unix Experimental.patch + unix
  • Mac Experimental.patch + mac

然而它开始变得麻烦,因为我们的补丁队列包含100多个名为windows-memory-optimization.patch + windows的补丁,unix-memory-optimization.patch + unix,windows-io-experimental-bug-fix.patch + windows等等我们把它组织成系列文件中的组,但文件变得越来越大,使用qseries / qapplied变得无法管理

相反,我们希望有一个windows,unix和mac的队列。

因此补丁可以组织为:

  • Windows补丁堆栈:memory-opt.patch,io-opt.patch等
  • Unix补丁堆栈:disk.patch,graphics.patch等
  • Mac补丁堆栈:io-fix.patch,io-opt.patch,experimental.patch等

然后将每个平台的补丁堆栈交换进出模拟器仓库。这样我就可以在Windows补丁堆栈上工作并弹出/推送各种子系统优化补丁,并独立于unix或mac补丁堆栈来处理它们。

看起来我不能这样做,除了为每个平台制作3个不同的repos并以这种方式维护补丁堆栈。

除了手动复制.hg / patches目录进出repo之外,还有办法实现“交换”补丁堆栈吗?

3 个答案:

答案 0 :(得分:17)

有趣地使用Mercurial队列:)

我在这里假设你已经在某个地方对你的mercurial队列进行了版本控制。如果你没有/那些不知道如何做的人,请看看the relevant section from the hgbook:这是一种很好的方式,可以在不应用补丁的情况下逐步协作/保存你的工作。

三个命名分支

应该可以在MQ存储库中为每个平台维护三个不同的named branches

要切换平台,只需切换活动分支。

alias mq='hg -R $(hg root)/.hg/patches'

首先创建一个Windows分支:

$ mq branch windows
marked working directory as branch windows

已创建,但尚未提交。

做一些事情,添加补丁:

$ hg qnew windowspatch
... do some stuff

刷新,弹出和提交:

$ hg qref
$ hg qpop -a
$ mq ci -m 'new windows branch'

您现在拥有默认分支和新的Windows分支:

$ mq branches
windows                       65:5fd4ef0b96c9
default                       64:06c1a56a3c08 (inactive)

现在创建一个Unix分支。

首先切换回基本默认分支:

$ mq up default
1 files updated, 0 files merged, 1 files removed, 0 files unresolved

创建一个新的unix分支并添加一个特定于unix的补丁:

$ mq branch unix
marked working directory as branch unix
$ hg qnew unixpatch
... blahblah
$ hg qref
$ hg qpop -a
$ mq ci -m 'adding unix branch'
$ mq branches
unix                          66:c51bb2c7b413
windows                       65:5fd4ef0b96c9
default                       64:06c1a56a3c08 (inactive)

用法

在操作mq repos之前不要忘记qpop -a ...

推送所有Windows补丁

$ mq up windows
xx files updated, yy files merged, zz files removed, ww files unresolved
$ hg qpush -a

三个物理回购

维护三个独立的(mercurial队列)分支看起来有点可怕。如果是这样,您可以使用三个不同的MQ存储库:每个平台一个,每个平台在不同的位置进行版本化。

例如:

$ cd mqs
$ hg qclone mq-windows windows
$ hg qclone mq-unix unix
$ hg qclone mq-mac mac

要在不同平台上工作,只需切换文件夹(repos)即可。这个概念与第一种方法类似。但是,不是在一个MQ repo中有三个内部分支,而是使用三个单独的MQ repos。

答案 1 :(得分:5)

要为“mq”创建等效的Windows别名,请在与“hg.exe”相同的目录中创建批处理文件(例如,“C:\ Program Files \ TortoiseHg”),将其命名为“mq.cmd”,并粘贴此代码:

@echo off
FOR /F "tokens=1 delims=" %%A in ('hg root') do SET hgRoot=%%A
hg -R %hgRoot%/.hg/patches %1 %2 %3 %4 %5 %6 %7 %8 %9

答案 2 :(得分:5)

我知道这个问题很老,但可能有人可能有兴趣知道还有另一个解决方案。我认为在提出这个问题时这是不可能的,但是这里有关于这种情况的更多信息:Multiple Patch Queues on MQ