You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:08