【问题标题】:git website update strategy - how to sync dev and live repositories?git 网站更新策略 - 如何同步开发和实时存储库?
【发布时间】:2011-09-01 01:19:13
【问题描述】:

以下是我构建 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

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

从这一点开始,我想知道:

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

简而言之:如何在不搞砸的情况下正确地将实时站点与开发分支同步?

【问题讨论】:

  • 好吧,您可以将其拆分为您的原始问题,然后自行回答其余问题。欢迎来到rubber ducking btw ;)
  • 我们在 stackoverflow 上是否有某种 Wiki? - 我认为您正在寻找的东西称为“博客”:)
  • @Tom - 你欠我一个新键盘!
  • 感谢 cmets 的快乐! :) 我问“当你在写的时候回答你自己的问题怎么办?”在 meta-stackoverflow 并在那里学到了一些新东西...meta.stackexchange.com/questions/92534/…
  • @Tobias 也许反对意见来自渴望回答的人......他们读了很多书但没有什么可回答的......按照你的建议和那些找到的和 meta-stackoverflow,我只是拆分了文本在我最初有疑问的时候......现在我必须等待 8 小时才能发布我自己的答案(像我这样的新用户的政策)......

标签: git deployment githooks


【解决方案1】:

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

更新网站只需将我的本地开发分支推送到网站存储库...

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

我的 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

它会:

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

我有这个设置,它可以满足我当前的需求,这很简单。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。我已经阅读了这两种设置,但我更喜欢我的。每个人都会选择和/或创造最适合他/她自己需求的,对吧?
    • 由于 git 是一个非常灵活的工具,它可以用于多种需求。谁没用过钥匙当螺丝刀?
    • 在我的“git-website-update-strategy”中,git被用作备份工具,一个大“BACK”按钮,一个源代码控制工具(我可以看到哪些文件已更改,哪些文件已更改),部署工具,可能还有更多...
    • @J. Bruni:恕我直言,你永远不会让它像所有这些一样工作。一方面,如果其他人/脚本能够在不使用 git 的情况下编辑服务器上的文件,您将永远无法可靠地推送到主服务器。
    • @Arrowmaster:我刚刚发布了我自己的答案......它适合我的需要;如果其他人在服务器上编辑文件(确实有少数人有 FTP 访问权限),这些更改将由 cronjob 提交到 repo(主分支),而“部署”方案确实检索主分支更改并将它们合并到 dev推送之前的分支 - 所以,它几乎总是会成功(我也可以添加一个“inotify”作业来立即提交其他人的更改......或者让这个提交成为部署过程的第一步)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 2021-02-26
      • 2011-06-27
      • 1970-01-01
      • 2011-06-19
      • 2014-10-19
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多