如何解决git网站更新策略-如何同步开发库和实时存储库?
| 这就是我构建git-powered-website更新和备份策略的方式: 我可以通过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
请注意,镜像存储库也是裸存储库(没有检出工作树)。
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”:
git clone ssh://user@example.com/path/to/website website_local
git checkout -b dev
现在,我可以在开发部门玩,并做我的工作。
从这一点来看,我想知道:
如何将我的更改推回实时网站?
如何从网站获取更改并合并到我的开发部门?
简而言之:如何正确地将实时站点与dev分支同步而又不搞乱呢?
解决方法
这是我实现的解决方案,可以满足将我的开发工作推向“生产”(实时网站)的需求,并且可以使我的本地存储库与实时网站上发生的更改保持最新...
要更新网站,只需要将我的本地开发分支推送到网站存储库即可。
git push origin dev
...然后将更改合并到实时网站树中。我需要SSH登录网站服务器,并在网站文件夹中运行以下命令:
git merge dev
这会将推送的更改从\“ dev \”分支带到\“ master \”分支(这是活动站点的当前分支)。
*改善更新过程*
为了自动运行合并,而无需从服务器命令行登录并运行merge命令,我向实时网站存储库添加了一个接收后挂钩。首先,我创建了挂钩文件,使其可执行,然后编辑了该文件:
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
更好的是:让我们先更新本地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
它会:
切换到本地主分支
使用网站最新的提交更改来更新本地主分支(同步)
切换回开发分支
合并对本地dev分支的更改(如果需要,请在此处解决冲突)
将本地dev分支推送到远程网站dev分支
在服务器上正确设置了post-receive钩子之后,它将自动快速转发网站存储库,因此开发更改将发布到生产环境中!
我已经完成此设置,并且可以满足我当前的需求,这很简单。
,您可能需要查看http://joemaller.com/990/a-web-focused-git-workflow/和http://toroid.org/ams/git-website-howto以获得有关集成git和web的更多信息部署系统。
请记住,git不是Web部署系统(尽管使用一些简单的脚本,它可以对那些有简单需求的人起作用)。
,或者,您可以像Github一样使用Git和Jekyll
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。