以下是我构建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 repo,允许我在必要时及时向后移动。我不需要太害怕因意外覆盖或删除而丢失东西......而且这个过程是自动化的!
我每天都会收到来自cronjobs的几封电子邮件。它允许我检查网站中已更改的内容,并确认两个cronjobs都正常运行。 (另一个cronjob设置为执行数据库备份。)
4)设置开发(本地回复+工作树) - 我直接从网站上查看了一份副本,然后创建了一个名为“dev”的新本地分支:
git clone ssh://user@example.com/path/to/website website_local
git checkout -b dev
现在,我可以使用开发分支,并完成我的工作。
从这一点来说,我想知道:
简而言之:如何正确地将实时网站与开发分支同步而不会弄乱事情?
答案 0 :(得分:3)
这是我实现的解决方案,以满足将我的开发工作推向“生产”(实时网站)的需求,并使我的本地存储库与实时网站上发生的更改保持同步......
更新网站只需将我的本地开发分支推送到网站存储库......
git push origin dev
...然后,将更改合并到实时网站树中。我需要SSH登录网站服务器,并在网站文件夹中运行以下命令:
git merge dev
这会将“dev”分支的推送更改带到“master”分支(实时站点当前分支)。
*改进更新程序*
要自动运行合并,无需登录并从服务器命令行运行merge命令,我在实时网站存储库中添加了一个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
更好的是:让我们首先更新本地主分支,然后将其合并到本地开发分支(听起来像一个rebase):
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'
现在,我可以使用“deploy”别名执行实时站点更新,如下所示:
git deploy
它会:
我有这个设置工作,它满足了我目前的需求,这很简单。
答案 1 :(得分:2)
您可能需要查看http://joemaller.com/990/a-web-focused-git-workflow/和http://toroid.org/ams/git-website-howto,以获取有关集成git和Web部署系统的更多信息。
请记住, git不是一个Web部署系统(尽管有一些简单的脚本,它可以为那些有简单需求的人提供这种方式)。
答案 2 :(得分:-1)
或者,您可以像Github那样使用Git和Jekyll