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

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


当前回答

灵感来自a3765910对Gradle的回答,但修改为运行每个构建。

将以下内容添加到应用程序的构建中。Gradle(假设你已经创建了你想要保存在源代码控制中的githooks/pre-commit文件):

copy {
    from new File(rootProject.rootDir, 'githooks/pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}

其他回答

要对hooks目录进行版本化(假设它存储在hooks/中),在工作副本根目录下创建一个.gitconfig文件,包含以下内容:

[core]
hooksPath = hooks

它将覆盖.git/config。

您可以使用托管解决方案来进行预提交钩子管理,例如预提交。 或者为服务器端git-hook提供集中式解决方案,如date .io。 它有内置的策略,如:

检测和防止秘密的合并。 执行正确的Git用户配置。 强制Jira票集成-在拉请求名称/提交消息中提到票号。

它不会替换所有的钩子,但它可以帮助开发人员使用最明显的钩子,而不必在每个钩子上都安装钩子 开发人员的电脑/回购。

免责声明:我是Datrees创始人之一

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

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

你可以让你的hooks文件夹成为另一个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