VSCode DevContainer中git commit报错:pre-commit存在却提示找不到
解决DevContainer中pre-commit钩子提示"No such file or directory"的问题
问题分析
结合你给出的环境信息,问题核心是:DevContainer内明明存在pre-commit钩子文件,但执行git commit时却提示找不到该文件。大概率是Windows与Linux的换行符不兼容,或是Debian Slim镜像缺少bash环境导致的。
解决方案
1. 转换文件换行符为LF
Windows系统默认使用CRLF换行,而Linux容器仅识别LF换行。如果pre-commit钩子是在Windows主机创建/复制到容器的,shebang行(#!/bin/bash)会被附加\r字符,系统会尝试寻找/bin/bash\r这个不存在的文件,从而触发报错。
操作方式:
- 在VSCode中打开pre-commit文件,点击右下角的
CRLF按钮,切换为LF后保存文件。 - 或在容器内通过命令转换:
# 先安装转换工具(若容器未预装) apt update && apt install -y dos2unix # 转换文件换行符 dos2unix .git/hooks/pre-commit
2. 替换shebang为/bin/sh
Python slim系列镜像(如python:3.10-slim-bullseye)默认未安装bash,仅提供POSIX兼容的sh。将钩子的shebang从#!/bin/bash改为#!/bin/sh,确保容器能找到脚本解释器:
修改后的极简钩子示例:
#!/bin/sh echo "test"
3. 直接运行钩子验证报错
在容器内进入项目目录,直接执行钩子文件,查看具体错误信息:
./.git/hooks/pre-commit
- 如果提示
bash: command not found,说明容器确实缺少bash,直接用方案2即可解决。 - 如果仍提示权限问题(虽已设777,可再次确认),执行:
chmod +x .git/hooks/pre-commit
验证
完成上述操作后,再次执行git commit -m "test",钩子应能正常输出"test"并完成提交流程。
内容的提问来源于stack exchange,提问作者johhny tex
相关产品推荐
相关产品推荐

