我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
我们想做一些基本的钩子脚本,大家都可以共享——比如预先格式化提交消息。Git有钩子脚本,通常存储在<project>/. Git /hooks/下。但是,当人们进行克隆时,这些脚本不会传播,并且它们不受版本控制。
是否有一种好方法可以帮助每个人获得正确的钩子脚本?我能不能让那些钩子脚本指向我的repo中的版本控制脚本?
当前回答
理论上,您可以在项目目录中创建一个包含所有脚本的hooks目录(或任何您喜欢的名称),然后将它们符号链接到.git/hooks中。当然,克隆该回购的每个人都必须设置这些符号链接(尽管您可以有一个非常出色的部署脚本,克隆程序可以运行该脚本半自动地设置它们)。
要在*nix上执行符号链接,你所需要做的就是:
root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"
如果您准备覆盖.git/hooks中的内容,请使用ln -sf
其他回答
对于Node.js用户来说,一个简单的解决方案就是更新包。json和
{
"name": "name",
"version": "0.0.1",
......
"scripts": {
"preinstall": "git config core.hooksPath hooks",
preinstall将在之前运行
npm安装
并重定向Git以查找。\hooks(或任何您选择的名称)目录中的钩子。这个目录应该模仿。\。Git \挂钩在文件名(减去.sample)和结构方面。
设想Maven和其他构建工具将具有与预安装相当的功能。
它还应该适用于所有平台。
如果需要更多信息,请参阅与团队共享Git钩子的两种方法。
大多数现代编程语言,或者说它们的构建工具,都支持插件来管理Git钩子。这意味着您所需要做的就是配置您的包。Json, pom.xml等文件,团队中的任何人都没有选择,除非他们更改构建文件。
该插件将为您添加内容到.git目录。
例子:
Git构建钩子Maven插件
githook-maven-plugin
git-hooks-js
对于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
我们使用的Visual Studio解决方案(以及项目)具有构建前和构建后事件。我正在添加一个名为“GitHookDeployer”的额外项目。项目在生成后事件中自我修改文件。该文件被设置为复制到构建目录。因此,项目每次都被构建,并且从未被跳过。在构建事件中,它还确保所有git钩子都到位。
请注意,这不是一个通用的解决方案,因为有些项目当然没有任何东西要构建。
在Git 2.9中, 配置选项核心。hooksPath指定自定义钩子目录。
将钩子移动到存储库中的钩子跟踪目录。然后,配置存储库的每个实例来使用跟踪的钩子,而不是$GIT_DIR/hooks:
git config core.hooksPath hooks
通常,路径可以是绝对的,或者相对于钩子运行的目录(通常是工作树的根;参见man githooks的描述部分)。