使用Mercurial,在执行更新时如何为每个变更集运行作业?

使用Mercurial,在执行更新时如何为每个变更集运行作业?,mercurial,batch-processing,updates,changeset,Mercurial,Batch Processing,Updates,Changeset,问题:当我将工作目录从一个修订版更新到另一个修订版时,我希望为通过的每个修订版运行一个脚本。我该怎么做 重要制约因素 脚本总是一样的 遍历应该以迭代的方式进行,我不想在100次修订中手工完成所有这些。。。 传入的钩子没有选项。它不仅必须发生在推送或拉取之后,而且必须发生在所有更新中,无论我在修订之间切换的频率有多高。 举例说明: r1*-r2-r3-R4头 基本上,我想这样做 r1*->r2然后运行脚本->r3然后运行脚本->r4然后 比方说,我的工作目录当前位于r1,现在我想将其更新为r4。例

问题:当我将工作目录从一个修订版更新到另一个修订版时,我希望为通过的每个修订版运行一个脚本。我该怎么做

重要制约因素

脚本总是一样的 遍历应该以迭代的方式进行,我不想在100次修订中手工完成所有这些。。。 传入的钩子没有选项。它不仅必须发生在推送或拉取之后,而且必须发生在所有更新中,无论我在修订之间切换的频率有多高。 举例说明:

r1*-r2-r3-R4头

基本上,我想这样做

r1*->r2然后运行脚本->r3然后运行脚本->r4然后


比方说,我的工作目录当前位于r1,现在我想将其更新为r4。例如,我想先更新到r2,然后运行脚本更新我的数据库,而不是像hg update那样直接更新。之后,我想更新到r3,然后运行相同的脚本,依此类推。

这是可行的,但我们必须小心从修订图中选择线性部分

考虑一个具有两个头的最小存储库,如果两个分支或两个书签:

$ hg log -G --template "{rev}\n"
o  4
|
| o  3
| |
| o  2
|/
o  1
|
o  0
假设我们从1开始。我们想沿着头4,线性部分是:1,4,或者沿着头3,线性部分是:1,2,3

因此,我们将使用具有两个参数的脚本:线性片段的开始和结束

这是赤裸裸的,但有效:

for rev in `hg log -r "descendants(1) and ancestors(3)" --template "{rev}\n"`
do
    echo Updating to $rev:
    hg update $rev
    echo Executing our script:
    hg id --id --num
done
以下是输出:

Updating to 1:
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
Executing our script:
4d5aba4313ce 1
Updating to 2:
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Executing our script:
f0de0712ec00 2
Updating to 3:
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Executing our script:
d052bd7c310b 3
无论工作目录的当前版本是什么,脚本都可以工作

在开始之前,您必须执行hg fetch以从远程获取更改,而无需将更改应用到工作目录和hg日志图以了解拓扑结构,从而选择线性段的起点和终点

您还必须用$1和$2 shell位置参数替换硬编码的1和3,并用实际脚本替换hg id行:-


为了了解它是如何工作的,我们使用mercurial的一个名为revsets do hg help revsets的功能来了解更多信息,该功能允许对历史图执行类似SQL的查询:-

您好,您检查了我的答案了吗?是的,我想我检查了。我能做更多的事吗?如果是的话,我愿意这样做。你的回答真的很有帮助。我认为你除了接受答案外,别无选择。我很高兴这很有帮助:-