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

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


当前回答

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

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

其他回答

在Git 2.9中, 配置选项核心。hooksPath指定自定义钩子目录。

将钩子移动到存储库中的钩子跟踪目录。然后,配置存储库的每个实例来使用跟踪的钩子,而不是$GIT_DIR/hooks:

git config core.hooksPath hooks

通常,路径可以是绝对的,或者相对于钩子运行的目录(通常是工作树的根;参见man githooks的描述部分)。

理论上,您可以在项目目录中创建一个包含所有脚本的hooks目录(或任何您喜欢的名称),然后将它们符号链接到.git/hooks中。当然,克隆该回购的每个人都必须设置这些符号链接(尽管您可以有一个非常出色的部署脚本,克隆程序可以运行该脚本半自动地设置它们)。

要在*nix上执行符号链接,你所需要做的就是:

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

如果您准备覆盖.git/hooks中的内容,请使用ln -sf

对于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

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

设置自定义钩子

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

启用自定义钩子

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

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

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

[core]
hooksPath = hooks

它将覆盖.git/config。