Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在存储库中交换Mercurial队列_Mercurial_Mercurial Queue - Fatal编程技术网

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

如何在存储库中交换Mercurial队列,mercurial,mercurial-queue,Mercurial,Mercurial Queue,我有一个平台无关的mercurial代码repo,名为“模拟器” 并希望在构建之前应用针对特定平台优化的补丁 根据指南,我们可以通过使用带防护装置的补丁来实现这一点 Windows.patch+Windows Unix.patch+Unix Mac.patch+Mac 但是,它开始变得麻烦,因为我们的补丁队列包含100多个名为windows-memory-optimization.patch+windows、unix-memory-optimization.patch+unix、window

我有一个平台无关的mercurial代码repo,名为“模拟器”

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

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

  • Windows.patch+Windows
  • Unix.patch+Unix
  • Mac.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等
然后在模拟器repo内外交换每个平台的补丁堆栈。因此,我可以使用windows修补程序堆栈和弹出/推送各种子系统优化修补程序,并独立于unix或mac修补程序堆栈使用它们

看起来我无法做到这一点,除了针对每个平台制定3种不同的回购协议,并以这种方式维护补丁堆栈


除了手动将.hg/patches目录复制到repo中或从repo中复制出来之外,是否还有其他方法可以实现“交换”补丁堆栈?

Mercurial队列的有趣用法:)

我假设您已经在某个地方对mercurial队列进行了版本控制。如果您不知道/对于那些不知道如何做到这一点的人,请看一看:这是一种在不应用修补程序的情况下以增量方式协作/保存工作的好方法

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

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

(使用别名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'
已创建,但尚未提交

做一些事情,添加补丁:

$ 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'
刷新、弹出和提交:

$ 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 queue)分支看起来有点可怕。如果是这样,您可以只使用三个不同的MQ存储库:每个平台一个,每个存储库的版本在不同的位置

例如:

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

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

要为“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

我知道这个问题由来已久,但可能有人有兴趣知道还有另一个解决方案。我认为在提出问题时这是不可能的,但这里有关于这种情况的更多信息:

我不确定该功能是何时添加的,但mq也支持每个repo有多个修补程序队列。您可以使用
hg qqueue
在它们之间创建和切换。不过,我喜欢这个答案:它似乎比内置支持更灵活。因为补丁队列repo只是一个repo,所以您可以在分支之间进行合并,以获得应该共享代码的补丁,等等。使用
hg qqueue
创建的队列看起来必须是完全独立的-在应用任何其他队列之前,每个队列都必须完全取消应用,而且似乎没有简单的方法可以同时对多个队列进行操作。对于像我这样登陆这里的人:不再需要mq别名;所有hg命令都有一个
--mq
标志,使它们能够在补丁程序存储库上运行。非常方便!我一看到NicDumZ的化名就想知道这件事。您不太可能需要超过9个参数,但为了增加通用性,您可以替换
%1…%9
%*
,将所有未执行的
移位
-ed参数传递给
hg