gpt4 book ai didi

Git pre-commit/pre-push hook 在提交时运行单元测试,在工作树上有未提交的更改

转载 作者:行者123 更新时间:2023-12-01 21:55:00 35 4
gpt4 key购买 nike

我目前有一个简单的 pre-commit 钩子(Hook)用于我的项目(在 R 中,虽然这是这个问题的附带),它运行单元测试:

#!/bin/sh
a=$(Rscript tests/testthat.R)
exit $a

其中 tests/testthat.R 是处理所有测试的包装文件。

但是这个钩子(Hook)有一个问题:如果我进行部分提交(这样仍有未提交的更改),测试将在工作树的当前状态上运行,包括未提交的更改。

所以,假设我完成了我正在做的事情的“第 1 步”,但忘记提交它。然后我开始“第 2 步”,但后来意识到我忘记提交“第 1 步”。如果“第 2 步”由于我未完成的更改而当前处于中断状态,我将无法对“第 1 步”进行部分提交,因为测试会检测到“第 2 步”有缺陷。

那么,有没有办法让钩子(Hook)在实际提交的版本上运行?我的想法是一个 Hook ,它可以有效地临时 checkout 提交,在该 checkout 上运行测试,删除 checkout ,然后定义是否允许提交通过。但是鉴于此 Hook 在提交完成之前触发,我假设无法检查它。

我也愿意接受 pre-push Hook 。这似乎更合理,因为 Hook 接收被推送的提交的 SHA,所以我上面的想法似乎更合理:获取最新的 SHA,创建一个临时目录, checkout 该 SHA,运行测试,删除目录。但后来我的问题变成了这是否实际上是建议的方法,或者是否由于我的无知而使事情过于复杂。

最佳答案

最后 git stash manual page描述了这个确切的用例:

You can use git stash push --keep-index when you want to make two or more commits out of the changes in the work tree, and you want to test each change before committing:

# ... hack hack hack ...
$ git add --patch foo # add just first part to the index
$ git stash push --keep-index # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part' # commit fully tested change
$ git stash pop # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

就这么简单

git stash push --keep-index
#
# testing...
#
git stash pop

不过,在钩子(Hook)中使用它有一个极端情况的风险:您可能有一个您忘记的旧的、不相关的存储,并且可能想要进行干净的提交(不留下任何未提交的更改)。

在这种情况下,对 git stash push --keep-index 的调用实际上不会创建存储(返回“没有要保存的本地更改”)。但是当测试完成时,git stash pop 会找到旧的存储,至少会导致头痛。

所以我的实际 pre-commit 钩子(Hook)看起来像:

#/bin/sh

hasChanges=$(git diff)
if [ -n "$hasChanges" ]; then
git stash push --keep-index
fi

#
# testing...
#

if [ -n "$hasChanges" ]; then
git stash pop
fi

exit $testSuccess

基本上,使用git diff 来查看跟踪的文件是否有任何更改。如果有,请将它们藏起来,然后 pop 。否则,不要为 stash 操作而烦恼。

关于Git pre-commit/pre-push hook 在提交时运行单元测试,在工作树上有未提交的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288499/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com