我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。

是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?


当前回答

如果你的项目是一个JavaScript项目,并且你使用npm作为包管理器,你可以使用shared-git-hooks在npm install上强制使用Git钩子。

完全披露:这个包是我写的

其他回答

对于Gradle用户

我发现这些脚本对于Gradle项目非常有用。

build.gradle

从:rootProject.file('gradle/install-git-hooks.gradle')

gradle - install-git-hooks gradle。

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

未雨绸缪

.... your pre commit scripts goes here

大多数现代编程语言,或者说它们的构建工具,都支持插件来管理Git钩子。这意味着您所需要做的就是配置您的包。Json, pom.xml等文件,团队中的任何人都没有选择,除非他们更改构建文件。

该插件将为您添加内容到.git目录。

例子:

Git构建钩子Maven插件

githook-maven-plugin

git-hooks-js

我想把几个答案合并成一个。假设你在你的项目/目录下:

设置自定义钩子

创建.githooks目录,并将你的钩子放在其中。(参见.git/hooks的例子) 创建一个.gitconfig文件,指向目录¹: Git config -f .gitconfig core。hooksPath .githooks 在你的Makefile中创建以下规则 enable-git-hooks: Git配置—本地包含。路径. . / .gitconfig $(警告记住,你必须审查自定义钩子!)

启用自定义钩子

每个开发人员都应该在检查后显式地启用这些自定义钩子。在README中添加一个指令,就像这样:

通过make Enable -git-hooks检查自定义钩子后启用它们。

我们使用的Visual Studio解决方案(以及项目)具有构建前和构建后事件。我正在添加一个名为“GitHookDeployer”的额外项目。项目在生成后事件中自我修改文件。该文件被设置为复制到构建目录。因此,项目每次都被构建,并且从未被跳过。在构建事件中,它还确保所有git钩子都到位。

请注意,这不是一个通用的解决方案,因为有些项目当然没有任何东西要构建。

对于Node.js用户来说,一个简单的解决方案就是更新包。json和

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks",

preinstall将在之前运行

npm安装

并重定向Git以查找。\hooks(或任何您选择的名称)目录中的钩子。这个目录应该模仿。\。Git \挂钩在文件名(减去.sample)和结构方面。

设想Maven和其他构建工具将具有与预安装相当的功能。

它还应该适用于所有平台。

如果需要更多信息,请参阅与团队共享Git钩子的两种方法。