如何将客户端钩子应用于Git中的所有本地存储库?

5
我在myrepo/.git/hooks目录下创建了一个commit-msg钩子。
#!/bin/sh
message=`cat $1`
c=`echo $message|grep -c 'fff'`
if[ $c -gt 0 ];then
  echo "Error"
  exit 1
fi
exit 0

当我尝试提交代码时,出现错误并阻止了提交。
$ git commit -m "reffrffffeffff fffeef"
Error

我接下来会执行以下操作:
$ cd myrepo
$ mkdir .hooks
$ mv .git/hooks/commit-msg .hooks/commit-msg
$ ln -s .hooks/commit-msg .git/hooks/commit-msg

尝试使用相同的消息再次提交。

提交成功。我猜我可能在上面的步骤中做错了什么?

有人能告诉我如何制作客户端钩子,并使每个开发人员从该钩子获取限制吗?


如果您需要所有开发人员都受钩子限制,则可能需要在共享远程上使用“pre-receive”钩子,而不是“pre-commit”钩子。 - Romain
@Romain:你可能知道,pre-receive可以阻止带有错误提交信息的推送,但是commit-msg会阻止提交。另一个选项是让每个开发人员自己安装commit-msg钩子(我在我的回答中详细说明了)。 - David Cain
另外,var=`cat $1`;var2=`echo $var | grep -c <regex>` 等同于 var2=`grep -c <regex> $1` 。而且你可以用检查 grep 的退出状态($?)来替换计数出现次数 - 如果找到正则表达式,grep 命令将返回 0。 - David Cain
1个回答

6

你的步骤中存在问题:

你创建了一个错误的符号链接。 commit-msg 符号链接指向 .git/hooks/.hooks/commit-msg。请尝试以下方法:

$ cd myrepo
$ mkdir .hooks
$ cd .git/hooks
$ mv commit-msg ../../.hooks/commit-msg
$ ln -s !$ commit-msg  # lazy: '!$' expands to '../../.hooks/commit-msg'

如何限制每个开发者的提交信息

正如您所知,commit-msg钩子是一个客户端钩子。如果您希望每个开发人员的提交消息符合某种方案,您需要让开发人员自己安装钩子。您不能将钩子作为存储库的一部分来维护,但在另一个Git存储库中保存它们是可行的。(要明确的是,您可以将它们保存在存储库中,但您的开发人员仍然需要在.git/hooks目录中创建符号链接,就像您做的那样)。

如果您真的想强制开发人员受到钩子的限制,请查看服务器端钩子。例如,您可以使用pre-receive来检查所有推送的提交消息是否符合您的方案。

Pro Git第8.3章(自定义Git-Git钩子)是一个很好的资源。那里有一些优质的指南可以帮助您。您还可以查看存储库中包含的.git/hooks示例文件。


嗨,David。我在.git/hooks中创建了pre-receive钩子。#!/bin/sh echo“$1” exit 1但是我仍然可以成功推送。 - Venus
即使我已经对其进行了chmod+x操作,git仍未执行pre-receive hook。 - Venus
抱歉,David,我无法访问您的链接地址。 "裸远程存储库" 意味着位于 "repositories" 文件夹中的远程服务器上的存储库吗?现在我已经在 repositories/test.git/hooks 中添加了 pre-receive 钩子,但仍然无法获得正确的结果。 - Venus
没错。很抱歉,如果没有相关的错误信息,我就无法再帮助你了。我建议你在钩子中添加一些打印语句以确保它们至少在运行,然后从那里开始调试。 - David Cain
是的,David。我已经解决了。如果使用“commit-msg”,每个开发者都必须创建符号链接,这有点麻烦。 - Venus
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接