在团队开发中,pre-commit 是非常常用的代码质量保障工具。但不少 Windows 用户在使用 pre-commit 时,会遇到 ExecutableNotFoundError: Executable /bin/sh not found
的报错。本文将详细分析原因,并给出完整的解决方案。
在 Windows 下执行 git commit
时,出现如下报错:
An unexpected error has occurred: ExecutableNotFoundError: Executable `/bin/sh` not found Check the log at C:\Users\用户名\.cache\pre-commit\pre-commit.log
pre-commit.log 里会有类似堆栈:
pre_commit.parse_shebang.ExecutableNotFoundError: Executable `/bin/sh` not found
pre-commit 在安装时,如果检测到 .git/hooks/pre-commit.legacy
文件,会进入兼容模式(migration mode),优先执行 legacy hook。很多老的 hook 脚本是 shell 脚本,shebang 为 /bin/sh
,而 Windows 没有这个解释器,导致报错。
如果 pre-commit hook 配置为 language: system
,pre-commit 可能会尝试用 shell 执行 entry,也会导致依赖 /bin/sh
。
如果 entry 只写了命令名(如 pylint
),部分 pre-commit 版本会用 shell 执行,间接依赖 /bin/sh
。
进入项目的 .git/hooks
目录,删除 pre-commit.legacy
文件:
powershellRemove-Item .git\hooks\pre-commit.legacy
powershellpre-commit install -f
这样只会用 pre-commit 的 hook,不再兼容老的 shell 脚本。
推荐将 language
设置为 python
,并将 entry
改为 python -m pylint
,如下:
yaml- repo: local
hooks:
- id: pylint
name: pylint
entry: python -m pylint
language: python
types: [python]
args: [
"--rcfile=pyproject.toml",
"-rn", # Only display messages
"-sn", # Don't display the score
]
这样 pre-commit 会直接用 Python 解释器运行,不再依赖 shell。
如果还有其他 hook(如 trailing-whitespace、end-of-file-fixer 等),请确认它们是否需要 shell 环境。大部分 Python 相关的 hook 都能在 Windows 下正常运行。
确保 pre-commit 版本为 4.x 及以上:
powershellpip install -U pre-commit
powershellpre-commit clean
Windows 下 pre-commit 报 /bin/sh not found
,99% 是 legacy hook 或配置问题。只要:
即可彻底解决。
本文作者:Silon汐冷
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!