编辑
2025-07-10
Python
00

目录

1. 问题现象
2. 问题原因分析
2.1 pre-commit hook 兼容模式
2.2 配置 language: system
2.3 entry 配置不当
3. 解决方案
3.1 删除 legacy hook
3.2 强制重新安装 pre-commit hook
3.3 修改 .pre-commit-config.yaml 配置
3.4 检查其他 hook
3.5 升级 pre-commit
3.6 清理 pre-commit 缓存
4. 总结

在团队开发中,pre-commit 是非常常用的代码质量保障工具。但不少 Windows 用户在使用 pre-commit 时,会遇到 ExecutableNotFoundError: Executable /bin/sh not found 的报错。本文将详细分析原因,并给出完整的解决方案。

1. 问题现象

在 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

2. 问题原因分析

2.1 pre-commit hook 兼容模式

pre-commit 在安装时,如果检测到 .git/hooks/pre-commit.legacy 文件,会进入兼容模式(migration mode),优先执行 legacy hook。很多老的 hook 脚本是 shell 脚本,shebang 为 /bin/sh,而 Windows 没有这个解释器,导致报错。

2.2 配置 language: system

如果 pre-commit hook 配置为 language: system,pre-commit 可能会尝试用 shell 执行 entry,也会导致依赖 /bin/sh

2.3 entry 配置不当

如果 entry 只写了命令名(如 pylint),部分 pre-commit 版本会用 shell 执行,间接依赖 /bin/sh

3. 解决方案

3.1 删除 legacy hook

进入项目的 .git/hooks 目录,删除 pre-commit.legacy 文件:

powershell
Remove-Item .git\hooks\pre-commit.legacy

3.2 强制重新安装 pre-commit hook

powershell
pre-commit install -f

这样只会用 pre-commit 的 hook,不再兼容老的 shell 脚本。

3.3 修改 .pre-commit-config.yaml 配置

推荐将 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。

3.4 检查其他 hook

如果还有其他 hook(如 trailing-whitespace、end-of-file-fixer 等),请确认它们是否需要 shell 环境。大部分 Python 相关的 hook 都能在 Windows 下正常运行。

3.5 升级 pre-commit

确保 pre-commit 版本为 4.x 及以上:

powershell
pip install -U pre-commit

3.6 清理 pre-commit 缓存

powershell
pre-commit clean

4. 总结

Windows 下 pre-commit 报 /bin/sh not found,99% 是 legacy hook 或配置问题。只要:

  • 删除 legacy hook
  • 配置 language: python,entry: python -m xxx
  • 强制安装 pre-commit hook

即可彻底解决。

本文作者:Silon汐冷

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!