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

git网站更新策略-如何同步开发和实时存储库?,git,deployment,githooks,Git,Deployment,Githooks,以下是我如何构建git支持的网站更新和备份策略: 我可以通过SSH访问网站所在的Linux VPS。以下是我所做的: 1) 在网站服务器上-在适当的网站文件夹(公共根目录前一级)创建git repo: 2) 在备份服务器上-为备份目的,在另一个VPS上创建镜像repo: git clone --mirror ssh://user@example.com/path/to/website website_backup 请注意,镜像回购也是一个裸存储库(没有签出的工作树) 3) 设置CRONJOBS

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

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

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

2) 在备份服务器上-为备份目的,在另一个VPS上创建镜像repo:

git clone --mirror ssh://user@example.com/path/to/website website_backup
请注意,镜像回购也是一个裸存储库(没有签出的工作树)

3) 设置CRONJOBS-一个在网站服务器上,以吸收wesbite文件系统的更改(更改可以通过脚本、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的电子邮件。它允许我检查网站中已更改的内容,并确认两个cronjobs都正常运行。(另一个cronjob被设置为执行数据库备份。)

4) 设置开发(本地回购+工作树)-我直接从网站上签出了一份副本,然后创建了一个名为“dev”的新本地分支:

现在,我可以和开发部门一起工作了

从这一点上,我想知道:

  • 如何将我的更改推回到live网站
  • 如何将网站的更改恢复并合并到我的开发分支
简而言之:如何正确地将live site与dev branch同步,而不把事情搞砸?

您可能需要查看和了解有关集成git和web部署系统的更多信息

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

您可能需要查看和了解有关集成git和web部署系统的更多信息


记住,git不是一个web部署系统(尽管通过一些简单的脚本,它可以为有简单需求的人工作)。

或者,你可以像使用git和Jekyll一样使用git和Jekyll,或者,你可以像使用git和Jekyll一样使用git和Jekyll这是我为满足推动我的开发工作的需要而实现的解决方案“生产”(现场网站),并使我的本地存储库与现场网站上发生的更改保持最新

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

git push origin dev
…然后,将更改合并到live网站树中。我需要使用SSH登录到网站服务器,并在网站文件夹中运行以下命令:

git merge dev
这将把“dev”分支上的推送更改带到“master”分支(即活动站点当前分支)

*改进更新过程*

为了自动运行合并,无需从服务器命令行登录并运行merge命令,我向live网站存储库添加了一个post receive钩子。首先,我创建了钩子文件,使其可执行,然后编辑了该文件:

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
我的post接收挂钩文件的内容如下:

#!/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选项。为什么会有此选项?之所以有此选项,是因为作为一个自动过程,我不希望将合并冲突存储到我的实时网站文件中。因此,使用此选项,我仅在具有干净的快进上下文的情况下强制合并。如果此干净的合并无法发生,则我可以登录到服务器,手动解决该案例,或者使用其他方法解决问题

*避免冲突和同步*

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

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

这样,我们的本地主分支与远程实时网站主分支保持同步,合并在本地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 pull origin master
git deploy
它将:

  • 切换到本地主分支
  • 使用网站最新提交的更改(同步)更新本地主分支机构
  • 切换回开发分支
  • 将更改合并到本地开发分支(如果需要,在此处解决冲突)
  • 将本地开发分支推送到远程网站开发分支
  • 在服务器上正确设置post-receive钩子后,它将自动快进网站repo,因此dev更改将发布到生产中


  • 我已经完成了这个设置,它满足了我当前的需求,这很简单。

    以下是我实现的解决方案,以满足将我的开发工作推向“生产”(实时网站)的需求,并使我的本地存储库与实时网站上发生的更改保持最新

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

    git push origin dev
    
    …然后,将更改合并到live网站树中。我需要使用SSH登录到网站服务器,然后运行