如何将我的预提交挂钩添加到现有的git存储库

时间:2015-09-18 10:21:20

标签: git githooks

我有一个预提交钩子,我想将它添加到存储库中,以便通过检查它,我的同事立即将它安装到位。
但是,如果我尝试添加它(在我的项目的根目录中),我得到以下结果:

$ git add  .git/hooks/pre-commit
error: Invalid path '.git/hooks/pre-commit'
error: unable to add .git/hooks/pre-commit to index

知道这项工作是否如何以及如何实现我的目标?

3 个答案:

答案 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 installcomposer 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 结尾,则提交通过,否则提交中断。