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 reset
和git 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 预提交钩子不起作用
如何通过 Git 和 Husky 添加提交钩子并实现代码任务自动化