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

Kwa*_*eng 9 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目录进出仓库,以完成"交换"补丁堆栈?

Nic*_*zet 17

有趣的使用Mercurial队列:)

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

三个命名分支

应该可以在MQ存储库中维护三个不同的命名分支,每个分支对应一个平台.

要切换平台,只需切换活动分支即可.

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

首先创建一个Windows分支:

$ mq branch windows
marked working directory as branch windows
Run Code Online (Sandbox Code Playgroud)

已创建,但尚未提交.

做一些事情,添加补丁:

$ hg qnew windowspatch
... do some stuff
Run Code Online (Sandbox Code Playgroud)

刷新,弹出和提交:

$ hg qref
$ hg qpop -a
$ mq ci -m 'new windows branch'
Run Code Online (Sandbox Code Playgroud)

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

$ mq branches
windows                       65:5fd4ef0b96c9
default                       64:06c1a56a3c08 (inactive)
Run Code Online (Sandbox Code Playgroud)

现在创建一个Unix分支.

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

$ mq up default
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
Run Code Online (Sandbox Code Playgroud)

创建一个新的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)
Run Code Online (Sandbox Code Playgroud)

用法

qpop -a在操作mq repos之前别忘了...

推送所有Windows补丁

$ mq up windows
xx files updated, yy files merged, zz files removed, ww files unresolved
$ hg qpush -a
Run Code Online (Sandbox Code Playgroud)

三个物理回购

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

例如 :

$ cd mqs
$ hg qclone mq-windows windows
$ hg qclone mq-unix unix
$ hg qclone mq-mac mac
Run Code Online (Sandbox Code Playgroud)

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

  • 我不确定该功能何时添加,但mq支持每个repo有多个补丁队列.您可以使用`hg qqueue`在它们之间创建和切换.我喜欢这个答案:它似乎比内置支持更灵活.因为补丁队列repo只是一个repo,所以你可以做一些事情,比如在分支之间合并应该共享代码的补丁,等等.使用`hg qqueue`创建的队列看起来必须完全独立 - 每个队列必须完全不应用才能应用任何其他队列,并且似乎没有简单的方法可以同时操作多个. (4认同)
  • 对于像我一样登陆这里的人:mq别名不再需要了; 所有hg命令都有一个`--mq`标志,使它们可以在补丁存储库上运行. (3认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

  • 非常便利!我一看到NicDumZ的别名就想知道这件事.你不太可能需要9个以上的参数,但为了增加一般性,你可以用`%*`替换`%1 ...%9`,将所有非`SHIFT`参数传递给`hg`. (2认同)

小智 5

我知道这个问题很老,但可能有人可能有兴趣知道还有另一个解决方案.我认为在提出这个问题的时候这是不可能的,但是这里有关于这种情况的更多信息:MQ上的多个补丁队列