Husky 预提交钩子和压缩提交

Posted

技术标签:

【中文标题】Husky 预提交钩子和压缩提交【英文标题】:Husky pre commit hook and squashing commits 【发布时间】:2022-01-07 13:17:52 【问题描述】:

我正在使用"husky": "^7.0.4"

我的团队在打开 PR 之前压缩了他们的提交。

我有一个pre-commit 文件来自动化这个工作流程。每隔一次我运行提交功能,预提交流程就会完美运行。所以第 1、3、5 等有效。第 2、4、6 次等时间打印此错误

fatal: cannot lock ref 'HEAD': is at 766hdjoXXX but expected 766e11XXX

我认为这可能是因为我没有更改文件,但是当我尝试更改某些内容时,它也不起作用(无论如何它都会成功并每隔一次失败)。知道有什么问题吗?

这是pre-commit 文件:

read -n1 -p "Do you want to squash commits? [n/Y]" SHOULD_SQUASH < /dev/tty

case $SHOULD_SQUASH in  
  n|N) 
    echo
    echo Skipping squash, now linting files...
    ;;
  y|Y) 
    [ -z "$SQUASH_BRANCH" ] && SQUASH_BRANCH=develop
    branch=$(git symbolic-ref HEAD)
    echo
    echo Squashing all commits from $branch
    git reset $(git merge-base $SQUASH_BRANCH $branch)
    echo ------SUCCESS!------
    echo Commits successfully squashed.
    git add .
    echo Added all files successfully.
    ;;
  *) 
    echo
    echo Skipping squash, now linting files...
    ;;
esac

npx pretty-quick --staged
npm run lint

squash 函数来自一个自定义函数,它可以正常工作,我们创建的位于.zshrc

【问题讨论】:

【参考方案1】:

一般来说,预提交文件不应使用git resetgit add有时可以使这项工作发挥作用,但您会得到奇怪的效果,包括您所看到的效果(有时更糟)。预提交脚本应该限制自己测试提交是否正常,如果是,则退出零;如果不是,则脚本应该以非零值退出,而不尝试进行任何更改。1

不要调用您的脚本.git/pre-commit 并使用git commit 调用它,而是调用它makecommit 并将其调用为makecommit。或者,将其称为git-c 并将其调用为git c。让脚本做它的事情——包括运行npm lint——如果一切看起来都不错,让它运行git commit。你根本不需要预提交钩子,但如果你愿意,你可以有一个如下所示的钩子:

[ "$RUN_FROM_OUR_SCRIPT" = yes ] && exit 0
echo "don't run git commit directly, run our script instead"
exit 1

然后,让您的脚本执行以下操作,而不仅仅是 git commit

RUN_FROM_OUR_SCRIPT=yes git commit

这将设置预提交挂钩测试的变量,以确保 git commit 是从您的脚本运行的。

请注意,您将不再需要从 /dev/tty 重定向 read。 (您可能还应该考虑使用git reset --soft,和/或验证该索引内容是否与工作树内容匹配。)


1如果你喜欢危险的生活,并且真的希望有一个可以更新文件的脚本,请确保 $GIT_INDEX_FILE 未设置或设置为 @987654339 @,以确保您没有被调用为git commit --only

【讨论】:

感谢您提供此信息!我添加了 post-commit 钩子,它似乎工作得很好,你预见到有什么问题吗? 这并不危险,确切地说,但是熟悉 Git 的用户不会期望 post-commit 钩子运行 git add,所以它可能仍然不是一个好主意。 太棒了,我添加了一个 bash 脚本来运行它。感谢您的帮助!

以上是关于Husky 预提交钩子和压缩提交的主要内容,如果未能解决你的问题,请参考以下文章

将其添加到 package.json 后,husky 预提交钩子不起作用

运行预提交 husky 脚本时未找到 Npx

如何通过 Git 和 Husky 添加提交钩子并实现代码任务自动化

使用 Husky 时出现预提交错误“找不到模块 - npx-cli.js”

如何仅在子目录中运行 husky 预提交

Husky v5 不创建 Git 钩子