我正在尝试使用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!
这是有道理的,因为我理解变更组必须在存储库上持有写锁,因此必须在钩子内部进行提交。但是我该如何解决这个问题?
我可以想到两种可行的方法,但不知道它们是否可行:
答案 0 :(得分:0)
您不应该尝试修改挂钩中的变更集,因为它是一个无法处理冲突等的外部进程。此外,我认为它甚至不可能或不可取。原始变更集将保持不变,并且有一天会导致重复问题。
您可以做的是根据某些条件批准或不批准传入的变更集。如果变更集未获批准,则由开发人员在其存储库中对其进行修改,然后再次将其推送。
答案 1 :(得分:0)
我发现只有pretxnchangegroup钩子锁定了存储库。更改组挂钩不会锁定存储库,并且在该挂钩中执行提交是可以的。