Git自动化部署时wp-config.php(数据库连接文件)被覆盖导致数据库错误的问题求助
我之前在WordPress多环境部署时碰到过几乎一模一样的麻烦,尤其是用Kinsta这类托管平台的时候,wp-config.php的配置差异很容易搞出数据库连接错误。让我帮你彻底解决这个问题:
问题根源分析
你当前的post-receive钩子用了git checkout -f——这个命令会强制将工作区所有文件重置为仓库的最新版本,不管本地有没有修改。这就解释了为什么你之前尝试提交staging的wp-config、加.gitignore都没用,甚至后面加的git checkout wp-config.php反而会从仓库拉取文件覆盖本地配置,完全搞反了方向。
分步解决方案
1. 先把wp-config.php从Git仓库彻底移除
如果仓库里还存在wp-config.php的记录,不管你本地怎么加.gitignore,checkout时都会拉取文件覆盖本地版本。所以第一步要清理仓库:
- 在你的本地开发环境,确保
wp-config.php已经加入.gitignore,然后执行以下命令:
这里git rm --cached wp-config.php git commit -m "Remove wp-config.php from repository to avoid environment conflicts" git push origin master--cached参数只会移除仓库中的文件记录,不会删除你本地的wp-config.php,完全不影响开发环境。
2. 让Git忽略Staging环境的wp-config.php修改
在Staging服务器的站点根目录(/www/XXXXX_975/public)执行以下命令,告诉Git“忽略这个文件的本地修改,不要处理它”:
git update-index --assume-unchanged wp-config.php
这个命令会标记该文件为“假设未修改”,后续的Git操作(比如checkout、reset)都不会覆盖它。
3. 修改post-receive钩子文件
把你当前钩子中错误的git checkout wp-config.php删掉,同时用更安全的reset --hard替代checkout -f(结合assume-unchanged标记,Git会跳过对wp-config.php的修改):
#!/bin/bash TARGET="/www/XXXXX_975/public" GIT_DIR="/www/XXXXX_975/private/XXXXX.git" BRANCH="master" while read oldrev newrev ref do if [[ $ref = refs/heads/$BRANCH ]]; then echo "Ref $ref received. Deploying ${BRANCH} branch to staging..." # 用reset --hard替代checkout -f,保留assume-unchanged的文件 git --work-tree=$TARGET --git-dir=$GIT_DIR reset --hard $newrev else echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server." fi done
修改完钩子后,记得给它加上可执行权限:
chmod +x /www/XXXXX_975/private/XXXXX.git/hooks/post-receive
4. 额外的最佳实践(推荐)
对于Kinsta平台,你可以利用它的环境变量管理来彻底避免wp-config.php的多环境差异问题:
- 在wp-config.php中用环境变量代替硬编码的配置:
define( 'DB_NAME', getenv('DB_NAME') ); define( 'DB_USER', getenv('DB_USER') ); define( 'DB_PASSWORD', getenv('DB_PASSWORD') ); define( 'DB_HOST', getenv('DB_HOST') ); // 其他配置同理,比如AUTH_KEY、SECURE_AUTH_KEY等也可以用环境变量 - 然后在Kinsta控制面板的站点设置中,分别给Production和Staging环境配置对应的环境变量。这样所有环境的wp-config.php可以完全一致,不用修改,也不会有覆盖问题。
验证方案
完成以上步骤后,推送一次测试变更到master分支,检查Staging环境的wp-config.php是否还会被覆盖,同时确认网站的数据库连接正常。
内容的提问来源于stack exchange,提问作者Jillian Hoenig

