为什么程序化执行git提交时配置的clean和smudge过滤器不生效?
核心问题原因
你只在自己的用户名下配置了过滤器的执行规则(clean/smudge命令),但应用运行的appuser用户的git配置中没有对应的过滤器定义,同时全局/系统级的gitattributes配置容易受运行环境的读取优先级影响失效。
解决步骤
- 优先使用仓库级配置,避免用户环境差异
进入仓库根目录,直接配置仓库本地的git规则,不受运行用户的全局配置影响:cd /home/appuser/repo # 配置本地仓库的过滤器执行规则 git config --local filter.sqlite3tosql.clean "sqlite3 %f .dump" git config --local filter.sqlite3tosql.smudge "sqlite3 %f" # 新建仓库本地的.gitattributes文件,绑定.db文件和过滤器 echo "*.db filter=sqlite3tosql" > .gitattributes # 将.gitattributes提交到仓库,后续所有操作该仓库的用户都会自动生效 git add .gitattributes git commit -m "add sqlite dump filter config" - 清理git缓存,触发过滤器重新执行
之前的二进制db文件已经被存入git缓存,需要清除缓存后重新添加才会触发过滤器:git rm --cached db.db git add db.db git commit -m "convert db to sql dump format" - 校验systemd环境变量(可选,如上述步骤生效可跳过)
如果配置后依旧失效,可在你的Python提交代码中打印HOME环境变量确认:
如果输出不是import os print(os.environ.get('HOME'))/home/appuser,需要在systemd服务配置的[Service]段添加Environment="HOME=/home/appuser",执行systemctl daemon-reload后重启应用服务即可。
内容的提问来源于stack exchange,提问作者Zev Averbach
相关产品推荐
相关产品推荐

