-1

我正在尝试使用检查提交的更改组或 pretxnchangegroup 挂钩创建一个 Mercurial 存储库,可能对其进行一些更改,然后提交更改。我的钩子做了类似的事情:

#!/bin/sh
if ! grep -q foobar foobar; then
  echo foobar >> foobar
  hg add foobar
  hg commit -m 'added foobar to foobar'
fi

但是当我推送到具有钩子的远程存储库时,它会挂起等待锁,我必须杀死它:

$ hg push
pushing to /tmp/a
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
foobar already tracked!
waiting for lock on repository /tmp/a held by 'duck:18140'
^Ctransaction abort!
rollback completed
interrupted!
interrupted!

这是有道理的,因为我知道更改组必须在存储库上持有写锁,钩子内的提交也必须如此。但是我该如何解决这个问题呢?

我可以想到两种可能可行的方法,但不知道它们是否可行:

  1. 如果在更改组完成并释放锁之后运行了一个钩子,我可以在那里运行提交。
  2. 将变更集附加到传入的变更组。
4

2 回答 2

0

您不应该尝试修改挂钩中的变更集,因为它是无法处理冲突等的外部进程。此外,我认为这甚至是不可能或不可取的。原始变更集将保持不变,并且有一天会导致重复问题。

您可以做的是根据某些标准批准或不批准传入的变更集。如果变更集未获批准,则由开发人员在其存储库中对其进行修改,然后再次推送。

于 2013-05-23T13:49:27.790 回答
0

我发现只有 pretxnchangegroup 挂钩会锁定存储库。更改组挂钩不会锁定存储库,并且在该挂钩中执行提交是可以的。

于 2013-05-23T14:29:38.467 回答