【发布时间】:2020-02-05 20:49:13
【问题描述】:
我目前有一个简单的 pre-commit 用于我的项目的钩子(在 R 中,虽然这是这个问题的附带问题),它运行单元测试:
#!/bin/sh
a=$(Rscript tests/testthat.R)
exit $a
其中tests/testthat.R 是处理所有测试的包装文件。
这个钩子有一个问题,但是:如果我进行部分提交(这样仍然有未提交的更改),测试将在工作树的当前状态下运行,包括未提交的更改。
所以,假设我完成了我正在做的某件事的“第 1 步”,但忘记提交了。然后我从“第 2 步”开始,但后来意识到我忘了提交“第 1 步”。如果“步骤 2”由于我未完成的更改而当前处于损坏状态,我将无法对“步骤 1”进行部分提交,因为测试会检测到“步骤 2”有缺陷。
那么,有没有办法让钩子在实际提交的版本上运行?我的想法是一个钩子,它可以有效地临时签出提交,在该签出上运行测试,删除签出,然后定义是否允许提交通过。但是鉴于这个钩子在提交完成之前触发,我假设不可能检查它。
我也愿意接受pre-push 钩子。这似乎更合理,因为钩子接收被推送的提交的 SHA,所以我上面的想法似乎更合理:获取最新的 SHA,创建一个临时目录,签出该 SHA,运行测试,删除目录。但后来我的问题变成了这实际上是建议的方法,还是由于我的无知而使事情过于复杂。
【问题讨论】: