Git推送Django项目时settings.py意外推送至服务器的解决方法
解决Git推送Django项目时settings.py被覆盖的问题
你的核心问题是settings.py已被提交到Git仓库历史(包括远程master分支),仅添加.gitignore和清除本地缓存无法彻底阻止它被推送覆盖,因为远程仓库仍存在该文件的追踪记录。以下是分步解决方法:
1. 停止本地Git对settings.py的追踪
执行命令移除本地仓库对该文件的追踪(不会删除本地文件):
git rm --cached settings.py
提交这个变更到本地Dev分支:
git commit -m "Stop tracking settings.py"
2. 清理远程仓库的settings.py记录(二选一)
方案A:强制推送覆盖远程历史(适合单人开发场景)
如果没有其他协作者,直接强制推送本地Dev分支到远程master,彻底移除远程仓库中settings.py的历史:
git push live Dev:master --force
⚠️ 注意:强制推送会覆盖远程master分支的全部历史,若有其他开发者协作需提前沟通。
方案B:用服务器钩子保留settings.py(适合多人协作或需保留远程历史)
在服务器的裸仓库中配置post-receive钩子,推送后自动恢复服务器上的settings.py:
- 进入服务器裸仓库的hooks目录:
cd /path/to/your/bare-repository/hooks - 创建并编辑
post-receive脚本:touch post-receive chmod +x post-receive nano post-receive - 添加以下内容(替换部署目录路径):
#!/bin/bash DEPLOY_DIR="/path/to/your/django/deployment/folder" git --work-tree=$DEPLOY_DIR checkout -f master # 恢复服务器原有settings.py git --work-tree=$DEPLOY_DIR checkout master -- settings.py - 保存退出后,后续推送代码时,服务器会自动保留原有settings.py不被覆盖。
3. 确认.gitignore配置正确
检查本地项目根目录的.gitignore文件,确保包含:
settings.py
若有Django其他需忽略的文件,可一并添加(如*.pyc、__pycache__/、media/等)。
4. 验证效果
修改本地任意非settings.py文件,提交后执行推送:
git push live Dev:master
登录服务器查看部署目录的settings.py,确认未被本地文件覆盖。
内容的提问来源于stack exchange,提问作者Mark Challice
相关产品推荐
相关产品推荐

