Mercurial:如何修改[pretxn] changegroup hook中的changegroup

时间:2013-05-23 12:59:49

标签: mercurial mercurial-hook

我正在尝试使用changegroup或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. 将更改集附加到传入的更改组。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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