将.git/hooks放入项目存储库(例如,使用符号链接)被认为是一种糟糕的做法吗?如果是,将相同的钩子传递给不同的Git用户的最佳方式是什么?
当前回答
存储在项目中并安装在构建中
正如其他人在他们的答案中所述,如果你的钩子是特定于你的特定项目的,那么就将它们包含在项目本身中,由Git管理。我想进一步说,考虑到使用单个脚本或命令构建项目是一种良好的实践,您的钩子应该在构建期间安装。
我写过一篇关于管理Git钩子的文章,如果您有兴趣深入阅读的话。
Java和Maven
完整的免责声明;我编写了下面描述的Maven插件。
如果您正在使用Maven为您的Java项目处理构建管理,那么下面的Maven插件将处理从项目中的某个位置安装钩子。
https://github.com/rudikershaw/git-build-hook
将所有Git钩子放在项目的一个目录中,然后配置pom.xml,使其包含以下插件声明、目标和配置。
<build>
<plugins>
<plugin>
<groupId>com.rudikershaw.gitbuildhook</groupId>
<artifactId>git-build-hook-maven-plugin</artifactId>
<configuration>
<gitConfig>
<!-- The location of the directory you are using to store the Git hooks in your project. -->
<core.hooksPath>hooks-directory/</core.hooksPath>
</gitConfig>
</configuration>
<executions>
<execution>
<goals>
<!-- Sets git config specified under configuration > gitConfig. -->
<goal>configure</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ... etc ... -->
</plugins>
</build>
当你运行你的项目版本时,插件会配置Git从指定的目录中运行钩子。这将有效地为项目中的每个人在该目录中设置钩子。
JavaScript和NPM
对于NPM,有一个叫做Husky的依赖,它允许你安装钩子,包括用JavaScript编写的钩子。
// package.json
{
"husky": {
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm test",
"...": "..."
}
}
}
其他人
此外,还有许多不同的钩子管理应用程序/插件,包括用于Python项目的预提交、用于Ruby项目的Overcommit和用于Ruby或Node.js项目的Lefthook。
其他回答
看起来很多帖子都过时了,至少如果你在python生态系统中使用预提交(+我发现在稍微旧版本的git中更改git钩子路径会失败,例如2.3)。使用.pre-commit-config。Yaml在你的repo根目录的hooks目录下,最简单的解决方案是运行:
pre-commit install -f --config hooks/.pre-commit-config.yaml
这里有一个脚本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想要的。在下面的评论中,我对在存储库中交付钩子脚本与在外部管理它们的用例和参数发表了看法。
您可以使用托管解决方案来进行预提交钩子管理,例如预提交。 或者为服务器端git-hook提供集中式解决方案,如date .io。
它有内置的策略,如:
检测和防止秘密的合并。 执行正确的Git用户配置。 强制Jira票集成-在拉请求名称/提交消息中提到票号。
它不会取代所有的钩子,但它可以帮助开发人员使用最明显的钩子,而不必在每个开发人员的计算机/存储库上安装钩子。
免责声明:我是Datrees创始人之一
存储在项目中并安装在构建中
正如其他人在他们的答案中所述,如果你的钩子是特定于你的特定项目的,那么就将它们包含在项目本身中,由Git管理。我想进一步说,考虑到使用单个脚本或命令构建项目是一种良好的实践,您的钩子应该在构建期间安装。
我写过一篇关于管理Git钩子的文章,如果您有兴趣深入阅读的话。
Java和Maven
完整的免责声明;我编写了下面描述的Maven插件。
如果您正在使用Maven为您的Java项目处理构建管理,那么下面的Maven插件将处理从项目中的某个位置安装钩子。
https://github.com/rudikershaw/git-build-hook
将所有Git钩子放在项目的一个目录中,然后配置pom.xml,使其包含以下插件声明、目标和配置。
<build>
<plugins>
<plugin>
<groupId>com.rudikershaw.gitbuildhook</groupId>
<artifactId>git-build-hook-maven-plugin</artifactId>
<configuration>
<gitConfig>
<!-- The location of the directory you are using to store the Git hooks in your project. -->
<core.hooksPath>hooks-directory/</core.hooksPath>
</gitConfig>
</configuration>
<executions>
<execution>
<goals>
<!-- Sets git config specified under configuration > gitConfig. -->
<goal>configure</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ... etc ... -->
</plugins>
</build>
当你运行你的项目版本时,插件会配置Git从指定的目录中运行钩子。这将有效地为项目中的每个人在该目录中设置钩子。
JavaScript和NPM
对于NPM,有一个叫做Husky的依赖,它允许你安装钩子,包括用JavaScript编写的钩子。
// package.json
{
"husky": {
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm test",
"...": "..."
}
}
}
其他人
此外,还有许多不同的钩子管理应用程序/插件,包括用于Python项目的预提交、用于Ruby项目的Overcommit和用于Ruby或Node.js项目的Lefthook。
预提交npm包很好地处理了这个问题,允许你在包中指定预提交钩子。json文件。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别