由于sourcetree中的husky pre-push,Git push失败

22

在推送React Native项目时,由于Husky pre-push失败而出现错误。

Husky > pre-push挂钩失败(添加--no-verify以跳过)

所有这些显示的错误都是类似于以下的Lint错误。

unused-vars

27:48  error    Trailing spaces not allowed    
                     no-trailing-spaces

75:5   warning  Unexpected console statement   
                     no-console

92:93  error    Unexpected trailing comma   
                        comma-dangle

96:81  error    Unexpected trailing comma

如何在Mac上的Sourcetree应用程序中关闭此功能?


如果你认为这些规则很好,那么你可以配置你的IDE自动格式化源文件以去除尾随空格等。这可能是我在这里要做的事情。 - Tim Biegeleisen
@TimBiegeleisen 我明白。但是那里有数百个建议/错误,我想尽快推送它。这些lint错误在我的团队成员尝试推送时没有显示出来。使用相同的Sourcetree版本。 - krishnakumarcn
4个回答

35
问题(虽然这不是真正的问题!)是由Husky创建的钩子造成的。Husky是一个npm软件包,允许您定义与本地Git事件(例如提交或推送)相关的npm脚本。这有助于在项目中执行协作标准。如果您太忙,快速解决方案就是删除git的hooks文件夹,该文件夹定义了pre-commit钩子,之后可以进行推送。(这只是一种避免为lint错误一次性编辑成千上万个文件的方法。遵循指南并解决所有lint错误,以获得更好的代码质量和可维护性。) 但是了解Husky和钩子如何工作,并正确遵循lint警告总是更好的选择。
编辑:您还可以在提供git命令行参数--no-verify时跳过hooks, git push origin master --no-verify,或使用Sourcetree的绕过提交hooks设置(位于提交消息字段顶部右侧的菜单中)。

我尝试了所有方法...更新husky@letest,删除node_modules,npm i,npm rebuild,但只有删除hooks文件夹才有效。不幸的是,下次运行npm i时它会出现问题。 - 12Bo
npm install会再次安装这些钩子。因此最好每次都将其删除,或者花一些时间遵循lint规则,以便您的项目风格良好。@12Bo - krishnakumarcn
4
如果你提供git命令行参数"--no-verify",或者使用Sourcetree中“绕过提交钩子”设置(在提交消息字段右上方的菜单中),你可以跳过挂钩。 - fabb
1
“Bypass commit hooks” 对我不起作用。我在 Windows 上使用 Sourcetree。 - Lucky Lam
1
这个回答似乎混淆了Husky相关的“hooks”和React相关的“hooks”。而且这些hooks并不相同。我建议只删除这一行:“问题(即使它不是真正的问题!)是由React创建的hooks引起的。” - Underwater_developer

12
我认为让你理解 husky 工具同样重要。
当我自己遇到困难时,我发现这篇文章在处理这种情况时非常有帮助。

Husky 是一个 npm 包,它可以让你定义与本地 Git 事件相关联的 npm 脚本,如提交或推送。这有助于在项目中执行协作标准。

在你的项目中,你提到所有错误都与代码检查有关。
因此,在那里编写了 husky 脚本,创建了一个叫做 pre-pushgit hook,在你成功地 git push 之前执行代码检查
在我看来,尤其是在团队中工作时,不要关闭/停用这些检查,也不要删除 .git/hooks 文件夹。相反,请返回并运行 lint script(通常在 package.json 中找到),进行所需更改,然后再次 git push 就会成功。

这是解决问题的正确方法:“运行lint脚本……修改所需更改……然后再次git push”。 - andres_v

5
在push命令的结尾处添加--no-verify标志。
git push origin master --no-verify

1
你实际上是通过使用 --no-verify 标志来覆盖了预推钩子。Husky 的错误是不言自明的。修复这些错误,推送就应该可以正常工作了。 - Julio Feferman

-1
将 --no-verify 添加到您的提交短语末尾。
我也在使用 Mac,并开始看到这些问题,我想是因为我在我的主项目文件夹中实例化了一个 Carlo 应用程序。由于我不确定 Husky 是什么(未安装“husky”命令),所以我开始四处寻找 linter,并猜测尝试使用 eslint。
➜  src_aminosee git:(master) ✗ eslint .
Error: Cannot find module '@ljharb/eslint-config'
Referenced from: /Users/tom/Dropbox/Sites/funk.co.nz/aminosee/carlojet/node_modules/array-includes/.eslintrc

这就是我意识到我在这里有一个 git 仓库内部的另一个 git 仓库('carlojet' 尝试文件夹在 'aminosee' 主项目中)!!我需要(应该)将那个文件夹移出去。不确定这种嵌套仓库问题是否导致了你的问题,但在这样移动并尝试提交后,我看到:
git commit -am "moved carlojet folder out as i think its git repo conflicted with this main one"
Can't find Husky, skipping pre-commit hook
You can reinstall it using 'npm install husky --save-dev' or delete this hook
Can't find Husky, skipping prepare-commit-msg hook
You can reinstall it using 'npm install husky --save-dev' or delete this hook
Can't find Husky, skipping commit-msg hook
You can reinstall it using 'npm install husky --save-dev' or delete this hook
Can't find Husky, skipping post-commit hook
You can reinstall it using 'npm install husky --save-dev' or delete this hook

我对git的了解不足,但在我看来,这些文件就像已经离开仓库并挥手告别;或者更可能是在aminosee/.git/hooks/目录中向我眨眼睛,因为它们已经从真正的家aminosee/carlojet/.git/hooks/上升到了那里(这真是个惊喜!)。

我可能需要禁用所有从其他项目复制的这些钩子... 或者更好的是启动那个linter!我想在我的情况下将git repo嵌套在自身内部并不是一个好主意。


husky 是一个 npm 包,它有助于在 git push/commit 之前强制执行编码标准,特别是在大型项目中。而 husky 脚本通常写在 package.json 文件或 .huskyrc 配置文件中。但对于你的情况,很可能你已经卸载了 husky,但是 git hooks 仍然存在。 - MwamiTovi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接