将git挂钩放入存储库

它被认为是一个不好的做法 – 将.git /钩子放入项目库(例如使用符号链接)。 如果是,那么为不同的git用户提供同样的钩子的最好方法是什么?

不,将它们放入存储库是好的,我甚至build议这样做(如果它们对其他人有用)。 用户必须明确地启用它们(正如你所说的,例如通过符号链接),这一方面有点痛苦,另一方面保护用户在未经他们同意的情况下运行任意代码。

我普遍同意Scytale,还有一些额外的build议,足够值得一个单独的答案。

首先,你应该写一个脚本来创build适当的符号链接,特别是如果这些钩子是关于强制策略或创build有用的通知。 如果只能inputbin/create-hook-symlinks ,那么人们使用钩子的可能性要大得多。

其次,直接符合链接钩子可以防止用户添加他们自己的个人钩子。 例如,我更喜欢示例pre-commit hook,它确保我没有任何空格错误。 解决这个问题的一个好方法就是在你的仓库中放入一个钩子包装脚本,然后将所有钩子符号链接到它。 包装器然后可以检查$0 (假设它是一个bash脚本;否则就是argv[0] ),找出它被调用的钩子,然后在你的仓库中调用适当的钩子,以及适当的用户钩子将不得不重新命名,将所有parameter passing给每个参数。 内存中的快速示例:

 #!/bin/bash if [ -x $0.local ]; then $0.local "$@" || exit $? fi if [ -x tracked_hooks/$(basename $0) ]; then tracked_hooks/$(basename $0) "$@" || exit $? fi 

安装脚本会将所有预先存在的钩子移到一边(将.local附加到它们的名字上),并将所有已知的钩子名称符号链接到上面的脚本中:

 #!/bin/bash HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc" # assuming the script is in a bin directory, one level into the repo HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks for hook in $HOOK_NAMES; do # If the hook already exists, is executable, and is not a symlink if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local fi # create the symlink, overwriting the file if it exists # probably the only way this would happen is if you're using an old version of git # -- back when the sample hooks were not executable, instead of being named ____.sample ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook done 

http://git-scm.com/docs/git-init#_template_directory可以使用以下机制之一来更新每个新创build的git仓库的;.git / hooks目录:

模板目录包含文件和目录,它们在创build后将被复制到$ GIT_DIR。

模板目录将是下列之一(按顺序):

  • 与 – 模板选项给出的参数;

  • $ GIT_TEMPLATE_DIR环境variables的内容;

  • init.templateDirconfigurationvariables; 要么

  • 默认的模板目录是:/ usr / share / git-core / templates。

https://www.npmjs.com/package/pre-commit npm包可以很好地处理这个问题,允许你在你的package.json中指定pre-commit钩子。