Git提交失败:ImportError无法从click导入'_unicodefun'问题咨询
问题根因
- 这个问题和你本次提交的代码改动完全无关,纯粹是pre-commit钩子的隔离环境依赖冲突导致的提交失败。
- 你之前反复切换、升级系统或项目本地的Click版本没用,是因为pre-commit跑钩子的时候根本不调用你外部环境的依赖,它有自己独立的缓存虚拟环境,就是报错路径里
/Users/danieljohnson/.cache/pre-commit/repovmer0o49/py_env-python3/这个目录下的环境,和你全局、项目虚拟环境里装的包完全隔离,你改外面的版本碰不到这个缓存里的依赖。 - 具体冲突逻辑很简单:你现在pre-commit配置里用的Black版本太老了,老版本Black有段兼容代码要导入Click的内部模块
_unicodefun,但Click从8.1.0版本开始就把这个内部模块删掉了,只要缓存环境里装的Click版本>=8.1.0,Black一启动就会抛这个导入错误,钩子直接执行失败,把提交拦下来。
解决方法
- 最稳妥的方案:打开项目下的
.pre-commit-config.yaml,把Black钩子的版本升到22.3.0及以上,新版本Black早就修复了和高版本Click的兼容问题。改完配置跑一遍pre-commit clean清掉旧的缓存,下次提交的时候pre-commit会自动重新拉取对应版本的钩子和匹配的依赖,问题直接解决。 - 不想升Black的兼容方案:如果因为项目规范暂时没法升级Black版本,可以在pre-commit配置里给Black钩子加个额外依赖,把Click版本固定在8.0.4——这是最后一个还保留
_unicodefun模块的版本,清完缓存重新提交就能正常运行。 - 应急方案:着急提交代码的话,执行commit命令的时候加
--no-verify参数就能跳过所有pre-commit钩子检查,不过这只是临时绕路,事后还是要把依赖冲突修好,不然配置的格式化检查等于失效。
内容的提问来源于stack exchange,提问作者Daniel Johnson
相关产品推荐
相关产品推荐

