防止 wp-config.php数据库连接在 git 自动化部署时被覆盖

问题描述

我无法让 git 在部署时忽略我的 wp-config.php 文件。我使用 git 设置了自动部署(这是一个非常棒的工具,如果您不了解它,您可以阅读它here - 您不需要像文章中指出的那样使用 kinsta 托管,尽管您的文件结构可能会有所不同)。

但是每次我推送更改时,它都会覆盖我的 wp-config.php 文件,从而导致站点上的数据库错误。发生这种情况是因为用于部署的 git hook 引入了更改,然后检查了任何本地更改。由于这是一个临时站点,它使用生产中的存储库,但在 wp-config.php 中有不同的值,以便连接到自己的数据库

到目前为止我尝试过的:

  • 在临时服务器上提交对 wp-config 的更改,这样它就不会被 git 钩子检出
  • 在临时服务器上将 wp-config.php 添加.gitignore(我本来应该这样做的)
  • wp-config.php 添加.gitignore(我本来应该做的)在开发和推进阶段
  • post-receive 挂钩中添加一行以在执行部署后检查对 wp-config.php 的更改

这是我的 post-receive 挂钩文件(客户端名称替换为 XXXXX):

#!/bin/bash
TARGET="/www/XXXXX_975/public"
GIT_DIR="/www/XXXXX_975/private/XXXXX.git"
BRANCH="master"

while read oldrev newrev ref
do
        # only checking out the master (or whatever branch you would like to deploy)
        if [[ $ref = refs/heads/$BRANCH ]];
        then
                echo "Ref $ref received. deploying ${BRANCH} branch to staging..."
                git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
                git checkout /www/XXXXX_975/public/wp-config.php
        else
                echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
        fi
done

站点位于 public 目录中。存储库位于不同的目录 private 中,以免被部署覆盖。

这是一个 wordpress 网站,托管在 Kinsta 上。如果我忘记包含任何信息,请告诉我。

谢谢!

解决方法

当您在未指定特定路径的情况下检出修订时,Git 将始终用修订中的文件覆盖工作树中的文件,并且无法避免这种情况。您的具体情况试图忽略对跟踪文件的更改,the Git FAQ explains cannot be done

既然你已经意识到这个文件不应该被跟踪并且应该被忽略,你可以只执行 git rm --cached wp-config.php 然后提交将其从存储库中删除。然后,当您将其推送到远程服务器时,该文件将被删除,但您将来会受益,您可以在将来为每个临时服务器和生产服务器配置自定义版本,而 Git 将不理会它。