【问题标题】:Where we might need pre-commit and pre-push hooks together to lint our code我们可能需要 pre-commit 和 pre-push 钩子来整理我们的代码
【发布时间】:2020-07-20 02:28:42
【问题描述】:
假设我们的项目中有 linter。我有一个预提交钩子,它将对我的项目进行 lint,如果 lint 通过且没有错误,它将提交。我想设置一个 pre-push 挂钩来在推送时对我的项目进行 lint。但我看不出在推送时这样做有什么意义,因为代码在提交时已经被 linted。那么,谁能给我指出一个已经有预提交链接的情况下,预推送 lint 是必要的吗?
【问题讨论】:
标签:
git
github
gitlab
githooks
pre-commit-hook
【解决方案1】:
如果您使用的是pre-commit 钩子,那么也不需要pre-push 钩子。两者都将涵盖正常使用中的同一组提交。两者都可以通过--no-verify 绕过,因此两者都不适合作为访问控制。尽管如此,pre-commit 钩子对于需要使用钩子的开发人员来说仍然是一个有用的工具。
如果您想对您的代码库强制执行 linting,您应该在 CI 系统中使用检查,用户无法修改该检查。这就为那些觉得它有用的用户留下了 pre-commit 钩子,而更高级的用户可能会创建许多他们不想 lint 的一次性提交,可以跳过它并依赖 CI。
【解决方案2】:
如果它们是同一组检查,我同意没有理由同时拥有 pre-commit 和 pre-push
但是,如果它们是不同的检查(我通常建议只在 pre-commit 中保留最快的检查,在 pre-push 中保留较慢的检查),那么就有理由同时使用这两个钩子。
一个例子可能很快,比如pre-commit 中的语法检查和pre-push 中的单元测试运行
【解决方案3】:
假设您在两个钩子上都对代码进行了 linting。假设你的分支使用了 pre-comit 钩子并且被 linted。还有另一个分支没有掉毛。然后你从无限分支中重新设置你的分支并想要推送。此时 pre-push 钩子会阻止你推动,除非你解决了这些 lint 问题。将 unlinted 分支合并到您的分支并尝试推送也是如此。