【问题标题】:Husky pre commit hook and squashing commitsHusky 预提交钩子和压缩提交
【发布时间】: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

【问题讨论】:

    标签: bash git husky


    【解决方案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 脚本来运行它。感谢您的帮助!
    猜你喜欢
    • 2021-10-21
    • 2013-12-15
    • 2017-02-08
    • 2016-09-02
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多