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

时间:2012-07-04 10:07:11

标签: git githooks

我在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

并尝试使用相同的消息再次提交。 提交成功。我想我可能在上面的步骤中做错了什么?

任何人都可以告诉我如何制作客户端钩子,并让每个开发人员从这个钩子中获得限制吗?

1 个答案:

答案 0 :(得分: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目录中创建符号链接,就像您一样。)

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

Pro Git的Chapter 8.3 (Customizing Git - Git Hooks)是一个很好的资源。那里有一些高质量的步道来帮助你。您还可以查看存储库.git/hooks中包含的示例文件。