将.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。
其他回答
预提交npm包很好地处理了这个问题,允许你在包中指定预提交钩子。json文件。
看起来很多帖子都过时了,至少如果你在python生态系统中使用预提交(+我发现在稍微旧版本的git中更改git钩子路径会失败,例如2.3)。使用.pre-commit-config。Yaml在你的repo根目录的hooks目录下,最简单的解决方案是运行:
pre-commit install -f --config hooks/.pre-commit-config.yaml
现在,你可以通过以下方法将一个受版本控制的目录设置为你的Git钩子目录,例如MY_REPO_DIR/。Githooks会是
git config --local core.hooksPath .githooks/
它仍然不能直接执行,但是,如果您在README(或其他任何东西)中添加一个注释,这需要每个开发人员付出最小的努力。
不,把它们放到存储库中就可以了。我甚至建议这样做(如果它们对其他人也有用的话)。用户必须显式地启用它们(例如,如您所说,通过符号链接),这一方面有点麻烦,但另一方面它可以保护用户在未经他们同意的情况下运行任意代码。
从TEMPLATE DIRECTORY,你可以使用这些机制之一来更新每个新创建的Git存储库的.git/hooks目录:
模板目录包含将被删除的文件和目录 在创建后复制到$GIT_DIR。 模板目录将是以下目录之一(按顺序): ——template选项给出的参数; $GIT_TEMPLATE_DIR环境变量的内容; init。templateDir配置变量;或 模板默认目录:/usr/share/git-core/templates
推荐文章
- 如何在Visual Studio中删除未推送的外向提交?
- Git在两个不同的文件之间的差异
- 我如何使用vimdiff来解决git合并冲突?
- 如何将更改提交到另一个预先存在的分支
- 为什么使用'git rm'来删除文件而不是'rm'?
- 我如何安装imagemagick与自制?
- 致命:git-write-tree:错误构建树
- Git克隆远程存储库的特定版本
- git隐藏的意图用例是什么?
- 从远程Git存储库检索特定的提交
- 如何配置git bash命令行补全?
- 我如何迫使git拉覆盖每一个拉上的一切?
- 撤销“git add <dir>”?
- 是否可以在不先签出整个存储库的情况下进行稀疏签出?
- 如何移除SSH密钥?