0

作为Mercurial 的后续行动:在“hg commit”之前强制执行“hg pull -u” 我已经开始使用钩子

[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 这就是我想要的
  • 如果有传入的变更集并且我有提交传出,它也会停止 hg pull。这确实很糟糕

我可以以任何方式重用相同的脚本,但更改挂钩设置并停止“hg push -f”吗?或者我可以在 forbid_2head.sh 中知道这是正在运行的推送命令还是拉取命令?

4

1 回答 1

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 进入,则具有值。请参阅Mercurial 书

所以,总而言之,我相信这是一个很好的“禁止多头”脚本:

#!/bin/sh
HEADS=$(hg heads --template 'x' | wc -c)
BRANCHES=$(hg branches | wc -l)
test $HG_SOURCE = 'serve' -a $HEADS -ne $BRANCHES
于 2012-11-01T08:20:33.283 回答