git网站更新策略-如何同步开发和实时存储库



以下是我如何构建基于git的网站更新和备份策略:

我可以通过SSH访问该网站所在的Linux VPS。以下是我所做的:

1) 在网站服务器-创建一个git repo,在适当的网站文件夹(在公共根之前一级):

cd /path/to/website
git init
git add -A
git commit -m "Website as of today."

2) 在备份服务器上-在另一个VPS:上创建了一个镜像回购,用于备份

git clone --mirror ssh://user@example.com/path/to/website website_backup

请注意,镜像repo也是一个裸存储库(没有检出的工作树)。

3) 设置CRONJOBS-一个在网站服务器上,以吸收wesbit文件系统的更改(可以通过脚本、FTP等进行更改)。它每天运行以下bash脚本:

#!/bin/bash
date=$(date +%d/%m/%Y)
cd /path/to/website
git add -A -v
git commit -m "Changes done at to website at ${date}"
exit 0

通过这种方式,实时网站更改将提交给存储库主分支。

在备份服务器上设置了另一个cronjob。它每天运行以下脚本,紧跟在上面的另一个脚本之后:

#!/bin/bash
cd /path/to/website_backup
git fetch -u ssh://user@example.com/path/to/website
exit 0

通过这种方式,我在备份服务器上有一个每日更新的"备份",它也是一个git repo,允许我在必要时及时向后移动。我不需要太害怕因为意外的覆盖或删除而丢失东西。。。而且这个过程是自动化的!

我每天都会收到来自cronjobs的几封电子邮件。它允许我检查网站中的更改,并确认两个cronjob都正确运行。(设置了另一个cronjob来执行数据库备份。)

4) 设置开发(本地REPO+工作树)-我直接从网站上查看了一份副本,然后创建了一个名为"dev"的新本地分支:

git clone ssh://user@example.com/path/to/website website_local
git checkout -b dev

现在,我可以玩开发分支了,可以做我的工作了。

从这一点上,我想知道:

  • 如何将我的更改推回到实时网站
  • 如何从网站上获取更改并合并到我的开发分支

简言之:如何在不搞砸的情况下正确地同步直播站点和开发分支?

以下是我实现的解决方案,以满足将我的开发工作推向"生产"(实时网站)的需求,并使我的本地存储库跟上实时网站上发生的变化。。。

要更新网站,只需将我当地的开发部门推到网站存储库中。。。

git push origin dev

然后,将更改合并到实时网站树中。我需要SSH登录到网站服务器,并在网站文件夹中运行以下命令:

git merge dev

这将把推送的更改从"dev"分支带到"master"分支(即活动站点当前分支)。

*改进更新过程*

为了自动运行合并,无需登录并从服务器命令行运行合并命令,我在实时网站存储库中添加了一个接收后挂钩。首先,我创建了钩子文件,使其可执行,然后编辑文件:

touch /path/to/website/.git/hooks/post-receive
chmod a+x /path/to/website/.git/hooks/post-receive
pico /path/to/website/.git/hooks/post-receive

我的后接收挂钩文件的内容是:

#!/bin/sh
unset GIT_DIR
cd /path/to/website
echo "Merging dev changes to master branch."
git merge --ff-only dev
exit 0

请注意添加到merge命令中的--ff-only选项。为什么它在那里?它之所以存在,是因为作为一个自动化的过程,我不想将合并冲突存储在我的实时网站文件中。因此,使用这个选项,只有当我有一个干净的快进上下文时,我才会强制合并。如果这个干净的合并不能发生,那么我可以登录到服务器,手动解决这个问题,或者使用另一种方法解决这个问题。

*避免冲突和同步*

为了避免服务器上的合并冲突,即确保那里的快速合并成功,最好使用远程回购的最新更改更新本地回购。换句话说:在推动我们的更改之前,用最新的实时网站更改(远程主分支)更新本地开发分支。可以这样做:

git pull origin master

更好的是:让我们首先更新本地主分支,然后将其合并到本地开发分支(听起来像是一个重组):

git stash save
git checkout master
git pull origin master
git checkout dev
git stash pop
git merge master

通过这种方式,我们的本地主分支与远程实时网站主分支保持同步,合并在本地100%执行。

*返回简化*

我创建了一个别名来方便处理:

git config alias.deploy '!git stash save && git checkout master && git pull origin master && git checkout dev && git stash pop ; git merge master && git push origin dev'

现在,我可以使用"部署"别名执行实时站点更新,如下所示:

git deploy

它将:

  1. 切换到本地主分支
  2. 使用网站最新提交的更改更新本地主分支机构(同步)
  3. 切换回dev分支
  4. 将更改合并到本地开发分支(如果需要,请在此处解决冲突)
  5. 将本地开发分支推送到远程网站开发分支
  6. 在服务器上正确设置接收后挂钩后,它将自动快进网站回购,因此开发更改将发布到生产中

我有这个设置,它满足了我目前的需求,这很简单。

您可能需要查看http://joemaller.com/990/a-web-focused-git-workflow/和http://toroid.org/ams/git-website-howto有关集成git和web部署系统的更多信息。

请记住,git不是一个web部署系统(尽管使用一些简单的脚本,它可以为有简单需求的人提供这种方式)。

或者,您可以像Github使用一样使用Git和Jekyll

最新更新