如何将我的实时站点下载到我的本地环境以使用 Git 进行设置?

How do I download my live site to my local environment to set it up with Git?

在过去的 24 小时内,我必须从头到尾阅读了 20 多篇关于 Git 和 Wordpress 的文章,以及该 Stack 站点上的所有相关问题和答案,但大多数要么太具体(因此过时)以至于仍然相关,或者他们关心的是从本地获取站点而不是相反。最重要的是,没有一个包含有关该过程实际需要哪些命令的信息,当涉及到像版本控制工具这样不直观的东西时,这是必需的。

上下文

我有一个网站是我用 XAMPP 在本地开发的。然后我使用 FTP 和 Duplicator 插件将站点和数据库上传到共享服务器。从那时起我一直在使用 FTP 进行更改,现在我想将 Git 合并到我的工作流程中以使事情变得更 productive/natural。目标是能够在我的本地开发服务器和生产服务器之间传输站点——没有 Github 或中间的其他存储库服务。

然而,即使是拥有大量 CLI 经验的人,在我阅读了所有文章并仔细研究了 man gitman gittutorial 之后,我仍然很困惑如何使用 Git 做我想做的事。

我要的是什么

例如,我知道当我在本地进行更改时,我先 git commit 然后 git push 将这些更改推送到实时服务器,但是我如何首先下载我的实时服务器开始在 Git 本地使用它 - 我是 git clone 还是:

git init
git add .
git pull  

.gitignore呢?我有 this sample file 告诉我应该包含什么,但是在整个过程中我应该在哪个点创建它?那么数据库呢?由于我以前的本地开发环境,我已经有一个本地设置,所以是否仍然建议每次使用 Duplicator 之类的工具将其替换为实时设置?

Git 作为一种工具,对于刚接触它的人来说是非常非常混乱的,而且当你必须考虑 Wordpress 时更是如此,所以我希望有经验的人能够将这些东西提炼成类似于指南的东西,告诉我需要什么命令 运行 将我的实时站点连接到我的机器,然后 运行 Git,以及详细信息任何特定于 Wordpress 的警告。

Git 不是文件传输协议。您无法将它与 FTP、SMB 等进行比较。

这并不意味着将开发更改转移到实时服务器。它是一个版本控制系统,用于跟踪对文件的更改。

如果实时网络服务器不是从共享 Git 存储库提供服务,则您不能 "pull" 来自实时网络服务器的文件。而且不应该。

Git 的作用是在称为存储库的东西中跟踪文件和对这些文件所做的更改。什么是远程,只是另一个 Git 存储库,可通过 HTTP 或 SSH 或其他传输协议访问,您可以使用它同步应用于任一存储库的变更集。

有一种方法可以做你想做的事,那就是将你的 webroot 设置为 Git 存储库,将你的客户端连接到该目录,这样你就可以在本地访问它(SSH、SMB、. ..) 并在将本地更改推送到服务器后在服务器上执行 git pull 。但这只是滥用 Git 来编辑您的实时服务器上的文件,我希望我不必解释为什么这是个坏主意。

但是您可以,请参阅 Using Git to Manage a Live Web Site 了解一些信息。

您需要的一个共享存储库。您使用它从您的开发机器推送到,同时您的网络服务器应该(间接地!)从同一个存储库中提取。无论您是自己托管此 repo 还是在 GitHub 中,都取决于您。如果您自己做,并且想将其托管在您的网络服务器上,请确保评估所有注意事项,从正确配置身份验证开始。

现在对于开发过程,您有一堆要放入 Git 的源文件。这部分很简单:初始化一个 Git 存储库,将所有相关文件复制到其中,包括您的项目专用 .gitignore 并在一次初始提交中添加所有内容。

现在由 Git 跟踪您的文件到您的网络服务器并进行每次更改:

  • 提交
  • 推送到远程仓库
  • 配置一个生成服务器,在提交时触发,或者轮询存储库的更改
  • 如果构建成功,让构建服务器将您的新站点部署到网络服务器

简而言之,这称为持续集成或持续交付 (CI/CD)。但这通常不会立即部署到实时服务器,而是先部署到测试环境。

另请参阅:Setting up a deployment / build / CI cycle for PHP projects

至于数据库更改,那是一个完全不同的问题。

方法论

我最初问这个问题的目的是建立两个存储库:一个在网站上的生产存储库和一个用于开发的本地存储库,这是一个几乎没有指导或文档的工作流程。从那时起,我也开始考虑在工作流中包含 Github 的更频繁的用例,因为它提供了代码的异地备份的优势。

Git两种方式使用都没有问题,因为it was designed with both in mind,所以这是个人喜好问题,是否考虑做两次git push(对两者都生产服务器和 Git 集线器)对额外数据安全层的合理权衡。我在下面详细介绍了这两个选项,其中每个选项都专注于将您的活动站点的最新版本传播到所有其他存储库。

先决条件

此答案假设之前已经设置了本地环境和数据库(无论是否与实时站点保持同步),因为在上线之前已用于在本地开发您的 Wordpress 网站,就像我的一样问这个问题时的具体情况。如果不是这种情况,您首先需要 set up a local environment and database 使用 XAMPP 之类的东西,然后再继续本指南的其余部分。

其他先决条件是:

  • 在生产服务器上安装了Git
  • 在您的本地开发机器上安装 Git
  • 能够log into SSH on your server without entering a passphrase(最简单的方法是根本不设置密码)

两个存储库(生产 → 开发)

来自生产服务器

在您的 Wordpress 根目录中 - wp-config.php 文件所在的位置 - 初始化远程 Git 存储库,并创建 .gitignore 文件:

git init
nano .gitignore

编辑 .gitignore 以仅包含您要进行版本控制的文件。我使用 slightly improved version of Bill Erickson's brilliant sample .gitignore for Wordpress(请参阅我的 Gist 的描述,了解我的 .gitignore 与 Bill 的有何不同)。

保存 .gitignore 文件后,运行:

git add . # Prepare all non-ignored files to be committed
git commit -m "Initial commit"
git config receive.denyCurrentBranch updateInstead

来自开发机

在本地服务器的 Wordpress 根目录中初始化本地 Git 存储库(例如,XAMPP/.../wordpress):

git init

配置 Git,将生产服务器添加为远程服务器,最后从中拉取:

git config --global user.email "youremail@example.com"
git config --global user.name "Your Name"

git remote add live ssh://user@hostname:path/to/server/repo/
git branch -u live/master master
git pull live

从现在开始,对一些文件进行本地更改后,提交并推送到生产服务器:

git add . :/ # Prepare all modified and added files to be committed
git commit -m "Message describing changes made in the commit"
git push live

三个存储库(生产 → 中央 → 开发)

来自生产服务器

git init
nano .gitignore

编辑 .gitignore 以仅包含您要进行版本控制的文件。我使用 slightly improved version of Bill Erickson's brilliant sample .gitignore for Wordpress(请参阅我的 Gist 的描述,了解我的 .gitignore 与 Bill 的有何不同)。

保存 .gitignore 文件后,运行:

git add . # Prepare all non-ignored files to be committed
git commit -m "Initial commit"

来自Git中心

创建一个没有 .gitignore 文件的新的空存储库。

要将服务器的 public SSH 密钥与您的帐户相关联:转到 https://github.com/settings/keys 并单击 New SSH Key。执行 cat ~/.ssh/id_rsa.pub 以输出服务器 public 密钥文件的内容。将此输出复制到 Key 字段中,并保存密钥。

如果您的开发机器使用与您的服务器不同的 SSH 密钥,您将需要为您的开发机器重复此过程 - 或者,您可以让您的开发机器使用与您的服务器相同的密钥对。

来自生产服务器

将 Github 存储库添加为远程并将生产站点推送到它:

git remote add central git@github.com:Kaos-Industries/industryroadmosque.git
git config receive.denyCurrentBranch updateInstead
git push -u central master

来自开发机

在本地服务器的 Wordpress 根目录中初始化 Git 存储库(例如,XAMPP/.../wordpress)并添加遥控器:

git init
git remote add live ssh://user@hostname:path/to/server/repo/
git remote add central git@github.com:Kaos-Industries/industryroadmosque.git
git fetch central master
git merge central master 
git reset --hard central/master

git config --global user.email "youremail@example.com"
git config --global user.name "Your Name"

从现在开始,在对一些文件进行本地更改后,将它们提交并推送到中央 Github 存储库和生产服务器:

git add . :/ # Prepare all modified and added files to be committed
git commit -m "Message describing changes made in the commit"
git push central # Push to GitHub, as a backup
git push live # Push to the production server, to make changes live

保持数据库更新

转到实时网站的 PHPMyAdmin 面板,确保选择了 Wordpress 数据库,然后转到 导出 选项卡。

转到本地服务器的 PHPMyAdmin 面板并确保选择了 Wordpress 数据库。选择 Check All,然后在下拉菜单下,Drop 删除所有数据库表。转到 Import 选项卡,导入从实时站点导出的数据库文件。

最后,要搜索和替换数据库中的 URL,请转到 SQL 选项卡和 运行 以下内容,确保替换分别包含您的实时网站和本地网站的网址:

UPDATE wp_options SET option_value = replace(option_value, 'https://www.example.com', 'http://localhost/wordpress') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET post_content = replace(post_content, 'https://www.example.com', 'http://localhost/wordpress');

UPDATE wp_postmeta SET meta_value = replace(meta_value,'https://www.example.com','http://localhost/wordpress');

请注意,如果您的实时站点启用了 HTTPS,则在 localhost 之前明确包含 http:// 协议是必需的 - 没有它,您本地站点的所有页面都将 return 404s。

处理上传文件夹

此时唯一需要考虑的是 Wordpress 的 wpcontent/uploads 文件夹,我不想用 Git 版本,因为它有多大而且可能大得多要得到。好消息是根本不需要从生产服务器中提取上传内容。相反,处理这个问题的更聪明的方法是使用 .htaccess 重写规则,使开发站点 link 上丢失的图像与生产站点上的对应图像相匹配。这巧妙地回避了需要保持上传文件夹同步的问题。

将以下两行添加到您的开发站点的 .htaccess 文件中,紧跟在 RewriteRule ^index\.php$ - [L] 行之后:

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# If images not found on development site, load from production
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^wp-content/uploads/[^/]+/.+\.(jpe?g|png|gif)$ https://www.example.com/[=21=] [R=302,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

请注意,要使上述重写规则生效,您的开发站点和生产站点不得共享单个 .htaccess 文件(即 .htaccess 文件未被共享,这一点至关重要在 Git 中跟踪)。否则,您将需要修改上述重写规则以有条件地检查图像是否正在从生产或开发中加载,并为每个重写规则编写单独的代码。

最后,将以下内容添加到您的活动主题的 functions.php 文件到 prevent Wordpress from quietly replacing anything in your .htaccess file

// Stop WordPress from modifying .htaccess permalink rules
add_filter('flush_rewrite_rules_hard','__return_false');