Pre-Commit Hook脚本检测特定文件夹未暂存文件失效问题排查
问题排查与解决方案
你的pre-commit钩子失效的原因主要有以下几点,对应解决方案如下:
1. 仅检测已跟踪文件的未暂存修改,遗漏未跟踪的新文件
git diff Resources/config只会输出已被git跟踪的文件的未暂存修改,对于从未执行过git add的新文件(未跟踪文件)完全不会检测到。
2. 用wc -l判断差异的方式不可靠
git diff的输出行数可能因文件内容的换行、git diff的格式输出(比如权限变更、空文件修改)出现误判,比如修改后刚好输出0行的情况,导致脚本错误认为没有未暂存修改。
修复后的钩子配置
替换原有脚本逻辑,改用git status --porcelain来全面检测未暂存修改(包括已跟踪文件的未暂存变更和未跟踪新文件):
- id: check-modified-files name: Check for Modified Unstaged Files entry: bash language: system args: - -c - | # 检测目标目录下的未暂存修改(已跟踪文件变更)和未跟踪新文件 if git status --porcelain Resources/config | grep -q -E "^ M|^??"; then echo "Error: Unstaged files found in the specific folder: ./Resources/config" exit 1 fi
代码说明
git status --porcelain:以简洁固定格式输出文件状态,避免格式变动导致误判^ M:匹配已跟踪且未暂存的修改文件^??:匹配未跟踪的新文件grep -q:静默匹配,只要有符合条件的行就返回非0退出码,触发错误提示
内容的提问来源于stack exchange,提问作者dev1417
相关产品推荐
相关产品推荐

