【问题标题】:With Mercurial, how to run a job for each changeset when doing an update?使用 Mercurial,在进行更新时如何为每个变更集运行作业?
【发布时间】:2023-04-01 08:09:01
【问题描述】:

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

重要限制

  • 脚本始终相同
  • 应该以迭代的方式进行遍历(我不想为 100 次修订手动完成所有这些...)
  • incoming 挂钩不是选项。它不仅必须在推送或拉取之后发生,而且对于所有更新都必须发生,无论我在修订之间切换的频率如何。

为了说明:

r1(*) -- r2 -- r3 -- r4(head)

基本上,我想做

r1(*) --> r2 (then run script) --> r3 (then run script) --> r4 (then...

假设我的工作目录当前位于r1,现在我想将其更新为r4。我不想直接更新(比如hg update),而是先更新到r2,然后运行一个脚本(例如update-my-database)。之后我想更新到r3,然后运行相同的脚本等等。

【问题讨论】:

  • 您好,您查看我的回答了吗?
  • 是的,我想我做到了。我可以做更多的事情吗?如果是这样,我愿意这样做。你的回答真的很有帮助。
  • 我认为您除了接受答案之外别无他法。我很高兴它有帮助:-)

标签: mercurial batch-processing updates changeset


【解决方案1】:

这是可行的,但我们必须小心从修订图中选择一个线性片段。

考虑一个有两个头的最小存储库(如果有两个分支或两个书签,情况也是如此):

$ 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 log --graph 了解拓扑结构,然后选择线性片段的起点和终点。

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

为了理解它是如何工作的,我们使用了一个称为 revsets 的 mercurial 功能(请通过 hg help revsets 了解更多信息),它允许对历史图执行查询(有点像 SQL :-)

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多