将.git/hooks放入项目存储库(例如,使用符号链接)被认为是一种糟糕的做法吗?如果是,将相同的钩子传递给不同的Git用户的最佳方式是什么?


当前回答

从TEMPLATE DIRECTORY,你可以使用这些机制之一来更新每个新创建的Git存储库的.git/hooks目录:

模板目录包含将被删除的文件和目录 在创建后复制到$GIT_DIR。 模板目录将是以下目录之一(按顺序): ——template选项给出的参数; $GIT_TEMPLATE_DIR环境变量的内容; init。templateDir配置变量;或 模板默认目录:/usr/share/git-core/templates

其他回答

从TEMPLATE DIRECTORY,你可以使用这些机制之一来更新每个新创建的Git存储库的.git/hooks目录:

模板目录包含将被删除的文件和目录 在创建后复制到$GIT_DIR。 模板目录将是以下目录之一(按顺序): ——template选项给出的参数; $GIT_TEMPLATE_DIR环境变量的内容; init。templateDir配置变量;或 模板默认目录:/usr/share/git-core/templates

现在,你可以通过以下方法将一个受版本控制的目录设置为你的Git钩子目录,例如MY_REPO_DIR/。Githooks会是

git config --local core.hooksPath .githooks/

它仍然不能直接执行,但是,如果您在README(或其他任何东西)中添加一个注释,这需要每个开发人员付出最小的努力。

这里有一个脚本add-git-hook.sh,您可以在存储库中作为常规文件发布它,并可以执行它来将Git钩子附加到脚本文件中。调整使用哪个钩子(pre-commit, post-commit, pre-push,等等),并在cat中定义钩子。

#!/usr/bin/bash
# Adds the git-hook described below. Appends to the hook file
# if it already exists or creates the file if it does not.
# Note: CWD must be inside target repository

HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
HOOK_FILE="$HOOK_DIR"/post-commit

# Create script file if doesn't exist
if [ ! -e "$HOOK_FILE" ] ; then
        echo '#!/usr/bin/bash' >> "$HOOK_FILE"
        chmod 700 "$HOOK_FILE"
fi

# Append hook code into script
cat >> "$HOOK_FILE" <<EOF

########################################
# ... post-commit hook script here ... #
########################################

EOF

该脚本具有可执行权限或者用户可以直接运行它。我使用它在提交后自动在其他机器上进行git-pull。

我回答了一个更简单的问题,这个问题不是他们问的,也不是OP想要的。在下面的评论中,我对在存储库中交付钩子脚本与在外部管理它们的用例和参数发表了看法。

看起来很多帖子都过时了,至少如果你在python生态系统中使用预提交(+我发现在稍微旧版本的git中更改git钩子路径会失败,例如2.3)。使用.pre-commit-config。Yaml在你的repo根目录的hooks目录下,最简单的解决方案是运行:

pre-commit install -f --config hooks/.pre-commit-config.yaml

预提交npm包很好地处理了这个问题,允许你在包中指定预提交钩子。json文件。