【问题标题】:Prevent wp-config.php (database connection) from being overwritten upon git automated deployments防止 wp-config.php(数据库连接)在 git 自动部署时被覆盖
【发布时间】:2021-09-19 23:04:45
【问题描述】:

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

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

到目前为止我已经尝试过:

  • 在登台服务器上提交对 wp-config 的更改,因此不会被 git hook 签出
  • 在暂存服务器上添加 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 目录中。 repo 位于不同的目录 private 中,以免被部署覆盖。

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

谢谢!

【问题讨论】:

  • 您的wp-config.php 文件是否已检入存储库?
  • 嘿@bk2204!你能澄清你的问题吗?
  • 您看到的 wp-config.php 文件是否覆盖了存储库中签入文件的一部分(也就是说,它被列为 git ls-files 的一部分),或者它只是在同一个目录,但没有被 Git 跟踪?
  • 是的,它被 git 跟踪。我提到我追溯添加到 gitignore,但它正在被 git 跟踪。
  • 如果你已经添加到.gitignore,那么备份服务器上的配置文件。之后,使用git rm 从 git 跟踪中删除文件。然后部署该提交(这将从服务器中删除文件!)并从备份中手动恢复文件。完成此操作后,git 将不会再接触这些文件(因为它们不再被跟踪,而且 .gitignore'd)

标签: git githooks automated-deployment


【解决方案1】:

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

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

【讨论】:

  • 编辑我的评论,因为我误解了@Jay 上面所说的内容 这会导致停机吗?有没有办法在不停机的情况下做到这一点(至少对于生产而言)?
  • 您可以编辑部署脚本以复制文件,然后执行结帐,然后将其复制回来。这会留下少量的停机时间(可能是一秒钟),但应该不会很长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2011-09-21
  • 1970-01-01
  • 2015-04-19
  • 2018-06-27
  • 1970-01-01
  • 2020-10-06
相关资源
最近更新 更多