2017-02-19 73 views
0

我试图强制用户将JIRA票证添加到git commit。git hooks在提交消息中执行JIRA票证号码

我使用了预先接收的钩子,但它只能在推后才能工作。我希望它在提交后工作,所以如果消息格式不正确,提交将失败,用户将可以选择编辑提交。

这是我的代码示例:

#!/usr/bin/env bash 

# set this to your active development branch 
#develop_branch="master" 
#current_branch="$(git rev-parse --abbrev-ref HEAD)" 

# only check commit messages on main development branch 
#[ "$current_branch" != "$develop_branch" ] && exit 0 

# regex to validate in commit msg 
commit_regex='(#-[0-9]+|merge)' 
error_msg="Aborting commit. Your commit message is missing either a JIRA Issue ('#-1111') '" 
rm -rf fl.txt 
echo $1 >> fl.txt 
fil="fl.txt" 

if ! grep -iE $commit_regex $fil; then 
    echo "$error_msg" >&2 
    exit 1 
fi 
rm -rf fl.txt 
+0

如果您希望提交失败,则需要预先提交挂钩。在提交后它不应该工作。 – jonrsharpe

+0

也许我错过了一些东西。如果我将使用预先提交,那么它将失败提交并允许用户进行编辑?我设法工作的唯一事情是预先接收。也许你有它的代码示例? – sarit

+0

是的,当您想要的行为符合预先提交的钩子时,您正在编写预接收钩子。请参阅可用钩子文档:https://git-scm.com/book/gr/v2/Customizing-Git-Git-Hooks – jonrsharpe

回答

0

,我设法工作是唯一的前收到

这是正确的做法:你制定一个策略(这里检查服务器端的提交消息(在此实例中,您的GitLab服务器使用GitLab custom hook):这是通过server-side hookserver-side hook完成的。

这意味着它会甩掉git push,迫使用户修改他/她的提交并再次推送。

我必须同时预先提交和预接收才能使预接收工作?

不,只需要预接收挂钩。尝试在服务器级别进行预提交挂钩工作是不可能的:您必须以某种方式将其分发给所有开发人员,以便他们在自己的本地回购库中激活它。这是不实际的。

+0

嘿,谢谢你的回复。 这对于为开发者分发钩子并不是问题,如果它能帮助我使它工作:) pre-receive只能在推后才能工作,但我希望进程在提交级别失败,因此用户将能够编辑他的消息并再次提交 – sarit

+0

这实际上是一个非常分布的问题,因为预先提交的钩子必须由开发者在本地激活,并且他/她可以绕过钩子。 – VonC

+0

与服务器端预接收挂钩相反,它不能被绕过,并且可能推送失败。所以这是正确的方法。 – VonC