我的.git/hooks目录下的pre-commit文件异常,请求排查修复
修复.git/hooks/pre-commit钩子异常问题
你的pre-commit钩子现在没法正常工作,我先帮你拆解下现有代码里的问题,再给你一套可行的修复方案:
现有代码的核心问题
- 写入文件时硬编码了
'config.php',但函数参数明明是filename,这会导致不管你要处理哪个文件,最终都会强制覆盖config.php,完全偏离了钩子的预期逻辑 - 文件操作没使用
with语句,不仅容易造成文件句柄泄漏,遇到异常时还可能导致文件无法正确关闭 - 通过字符串索引截取密码的方式非常脆弱——只要配置文件里
password字段的格式稍有变化(比如多了空格、引号类型不同),这段逻辑就会直接失效 - 代码看起来被截断了,后半段的
print语句没写完,逻辑不完整
修复后的完整pre-commit钩子代码
from __future__ import absolute_import from __future__ import print_function from __future__ import unicode_literals import argparse import io import sys def replace_strings(filename): # 使用with语句安全处理文件,自动管理资源,避免泄漏 with open(filename, 'r', encoding='utf-8') as f: configtext = f.read() # 更健壮的密码字段匹配逻辑(假设格式为 password = "xxx";) password_key = 'password' start_marker = f'{password_key} = "' start_pos = configtext.find(start_marker) if start_pos == -1: print(f"Warning: 未在{filename}中找到'{password_key}'字段", file=sys.stderr) return # 定位密码值的起止位置 value_start = start_pos + len(start_marker) value_end = configtext.find('"', value_start) if value_end == -1: print(f"Warning: {filename}中'{password_key}'字段的引号未闭合", file=sys.stderr) return # 替换密码内容 password_old = configtext[value_start:value_end] password_new = "test0000" new_config = configtext[:value_start] + password_new + configtext[value_end:] # 写回原文件(注意:此操作会直接修改文件,测试前建议备份) with open(filename, 'w', encoding='utf-8') as f: f.write(new_config) print(f"已更新{filename}中的{password_key}:从'{password_old}'改为'{password_new}'") def main(): parser = argparse.ArgumentParser() parser.add_argument('filenames', nargs='*', help='需要检查的文件') args = parser.parse_args() # 只处理目标配置文件,避免误改其他文件 for filename in args.filenames: if filename.endswith('config.php'): replace_strings(filename) return 0 if __name__ == '__main__': sys.exit(main())
额外必做事项
- 确保钩子文件有可执行权限:在终端执行
chmod +x .git/hooks/pre-commit - 测试前建议备份你的
config.php文件,避免意外数据丢失 - 如果只是想检查密码是否合规而非自动修改,可以去掉写文件的逻辑,改成返回非0错误码阻止提交
内容的提问来源于stack exchange,提问作者Areso
相关产品推荐
相关产品推荐

