作为Mercurial: enforce "hg pull -u" before "hg commit"的后续行动 我已经开始使用钩子了
[hooks]
pretxnchangegroup.forbid_2heads = /usr/local/bin/forbid_2head.sh
其中forbid_2head.sh看起来像这样
#!/bin/bash
BRANCH=`hg branch`
COUNT=`hg heads --template '{branch}|{rev}\n' | grep ^${BRANCH} | wc -l`
if [ "$COUNT" -ne "1" ] ; then
echo "=========================================================="
echo "Trying to push more than one head, which is not allowed"
echo "You seem to try to add changes to an old changeset!"
echo "=========================================================="
exit 1
fi
exit 0
它是在http://tutorials.davidherron.com/2008/10/forbidding-multiple-heads-in-shared.html找到的脚本的衍生物 我允许多个命名分支。
我现在遇到的问题是
我可以以任何方式重用相同的脚本但更改挂钩设置并停止“hg push -f”吗? 或者我可以在forbid_2head.sh中知道这是推送还是拉动命令?
答案 0 :(得分:1)
首先,脚本不完全正确:它只计算当前在服务器上检出的分支中的头数(一个hg branch
)报告。您可以使用
hg heads tip
获取tip
分支的负责人。但是有人可能会一次在多个分支上推送变更集,所以你真正想要的是
hg heads --template '{branch}\n' $HG_NODE:tip
查找$HG_NODE:tip
触及的分支的分支头(在尚未提交的事务中推送的变更集)。然后,您可以将其与
hg log --template '{branch}\n' -r $HG_NODE:tip | sort -u
是变更组触及的分支。
如果您不想允许现有的多个头,那么您可以将上述内容简化为
$(hg heads --template 'x' | wc -c) -eq $(hg branches | wc -l)
只是测试分支头的数量是否等于分支的数量 - 即,每个命名分支只有一个分支头。
有了这个,让我提一下$HG_SOURCE
。该环境变量由Mercurial在运行钩子时设置:如果使用直接文件系统访问将更改组推入存储库,则它具有值push
,如果更改组进入,则值serve
通过SSH或HTTP。请参阅the Mercurial book。
因此,总而言之,我相信这是一个很好的“禁止多头”剧本:
#!/bin/sh
HEADS=$(hg heads --template 'x' | wc -c)
BRANCHES=$(hg branches | wc -l)
test $HG_SOURCE = 'serve' -a $HEADS -ne $BRANCHES