我有一个预提交钩子,我想将它添加到存储库中,以便通过检查它,我的同事立即将它安装到位。
但是,如果我尝试添加它(在我的项目的根目录中),我得到以下结果:
$ git add .git/hooks/pre-commit
error: Invalid path '.git/hooks/pre-commit'
error: unable to add .git/hooks/pre-commit to index
知道这项工作是否如何以及如何实现我的目标?
答案 0 :(得分:9)
检查出我的同事立即就绪了
<强>九月2015 :这是不可能的:一个钩子可以放在源代码控制中(你只需要在你的git仓库中复制脚本),但它不能自动到位&#34; (主动)克隆/结账:这将太危险了,这取决于钩子实际上在做什么 另请参阅&#34; Git remote/shared pre-commit hook&#34;
您仍然需要通过在git仓库中添加符号链接(甚至在Windows上)来激活它。
2016年12月更新:OP Calamity Jane提及in the comments:
我现在已经在symfony2项目中解决了这个问题(和其他项目一样,它也应该有效)将它作为
composer.json
的一部分。 因此,如果某位同事正在执行composer install
或composer update
,则会自动将其放置在正确的位置。
"scripts": { "dev-install": [ "bash setup_phpcs.sh" ] },
因此,在dev上,
setup_phpcs.sh
会自动被调用,并将钩子从存储库中的文件夹复制到正确的位置。
由于钩子是存储库的一部分,因此可以轻松更新和分发。
正如Hi-Angel中的the comments所述:
我想出来了:Emacs有
build-aux
dir有钩子,并且在运行autogen.sh
时,所有钩子都从那里复制。
答案 1 :(得分:1)
2019年的fyi信息也有此选项:
需要此软件包:“ brainmaestro / composer-git-hooks”
并将以下几行添加到您的composer.yaml
"extra": {
"hooks": {
"commit-msg": [
"regex=\"^([A-Z]{2,4}-[0-9]{1,4}|(no-ticket|NO-TICKET)):[\\s]*.{10,}\"",
"file=`cat $1`",
"if ! [[ $file =~ $regex ]]; then",
" echo \"ERROR - Commit message is wrong or too short. E.g. XXX-33: Description or no-ticket : Description\"",
" exit 1",
"fi"
],
"pre-commit": [
"git status --porcelain | grep -e '^ [AM]\\(.*\\).php$' | cut -c 3- | while read line; do",
"ROOT=`php -r \"echo __DIR__;\"`",
"bin/php-cs-fixer fix -nq --config=$ROOT/.php_cs \"$line\";",
"bin/phpcbf --standard=PSR2 --encoding=utf-8 -n -p \"$line\";",
"git add \"$line\";",
"done",
"echo committing on branch $(git rev-parse --abbrev-ref HEAD)"
]
}
}
这是示例,对我有用。它的基本作用是:
每次您运行“ composer install”或“ composer update”时,都会检查.git / hooks中的钩子。如果挂钩已经就位,则不会发生任何事情。如果缺少它们,那么将从上方开始的行解析为带有shebang的钩子。然后,在有人触发钩子时执行它们。
如果您没有IMO大型脚本,那么比复制周围的脚本更好。
注意:如果您更改了composer.json中的钩子行,则必须在运行“ composer install”之前先删除相应的钩子,否则一切都不会改变。
答案 2 :(得分:1)
如果你的 repo 是一个 npm 应用,你可以添加这个不错的库作为依赖:husky
package.json
...
"devDependencies": {
...
"husky": ">=4"
},
"husky": {
"hooks": {
"pre-commit": "npm test"
}
}
pre-commit
基本上可以是任何命令:如果它以退出代码 0 结尾,则提交通过,否则提交中断。