繁体   English   中英

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

[英]git website update strategy - how to sync dev and live repositories?

以下是我构建 git-powered-website 更新和备份策略的方式:

我有 SSH 访问托管网站的 Linux VPS。 这是我所做的:

1)在网站服务器 - 在适当的网站文件夹(公共根之前的一级)创建了 git 存储库:

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

请注意,镜像仓库也是一个裸仓库(没有签出的工作树)。

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 存储库,如果需要,我可以及时向后移动。 我不需要太害怕因意外覆盖或删除而丢失东西......而且这个过程是自动化的!

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

4)设置开发(本地回购+工作树) - 我直接从网站上签出一个副本,然后创建一个名为“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”分支(即实时站点当前分支)。

* 改进更新过程 *

为了自动运行合并,无需登录并从服务器命令行运行合并命令,我在实时网站存储库中添加了一个 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

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

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

请注意添加到合并命令的--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

这样,我们的本地 master 分支与远程直播网站 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'

现在,我可以使用“deploy”别名执行实时站点更新,如下所示:

git deploy

它会:

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

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

You might want to look at http://joemaller.com/990/a-web-focused-git-workflow/ and http://toroid.org/ams/git-website-howto for further information on integrating git and web部署系统。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM