将Git分支直接推送到实时服务器目录,以便实时查看文件

时间:2011-04-02 00:08:55

标签: git git-push git-remote git-add

如何在Git中设置远程目录,我可以在本地将阶段分支推送到远程并查看登台服务器上的实时更改,例如stage.example.com?

我所拥有的概念(我离开SVN的部分原因)是我可以维护(本地)3个不同的“主要”分支,如下所示:

  • master - 用于本地开发,工作目录
  • 阶段 - 应与登台服务器目录(远程)
  • 同步
  • 直播 - 这应该是可公开访问的网站(远程)

我的想法(以及其他人声称的可能)是我可以从本地计算机维护这些远程“站点”,而无需经常登录我的远程服务器shell并运行svn update(在我目前svn工作流程我需要一直这样做......)或者当然在我的Git工作流程中运行遥控器上的git pull

如何设置远程目录,以便我可以在本地将stage分支推送到staging remote server并查看上的更改(例如) {{1}马上?

然后,一旦stage.example.com一切正常并经过测试,我就可以在本地stagepush遥控器进行我在{{1}上测试的这些更改到现场网站。

这可以做到这一点,还是我在这里得到疯狂的想法,而这些想法根本不是用Git来完成的?

如果这很重要,请参阅我的本地和远程服务器的一些统计信息:

remote server:      Dreamhost (shared account)
remote GIT version: 1.7.1.1
remote GIT client:  shell

local computer:     Mac Pro (Snow Leopard 10.6.6)
local GIT version:  1.7.2.3
local GIT client:   Tower.app // git-tower.com

此外,到目前为止,我未成功尝试了以下工作流程:

  1. 在遥控器上创建一个live Git仓库(所以我可以从任何地方访问它)
  2. 将此远程仓库克隆到本地目录,并使用Gi​​t Tower应用程序对其进行管理
  3. stage
  4. 中本地工作
  5. --baremaster (HEAD) git repo从远程服务器复制到我的远程实时域scp -r
  6. 将远程添加到本地工作副本,然后尝试推送到--bare
  7. 显然这不起作用,但我不知道为什么或如何做得更好。

    来自SVN背景我是Git的新手,但已经看了很多教程(Peepcode& ThinkVitamin),但仍然无法弄清楚如何设置它。

1 个答案:

答案 0 :(得分:4)

使用DVCS(“分布式”VCS,如Git或Mercurial)实现的一个概念是notion of publication (推/拉)添加到分支的概念中。
CVCS(“集中式”VCS,如SVN)只有分支(以及一个中央仓库,可以推送到服务器上)。

在您的情况下,登台或直播是发布步骤,即不同的Git仓库准备接收您希望在登台或实时环境中看到的修改。

这意味着:

  • 2个分支,用于跟踪暂存(“staging”分支)或实时(“live”分支)的内容。
  • 1个远程裸仓(in order to be able to push to it,推送staginglive分支
  • 1 post-update hook用于裸仓库in order to checkout and update a working tree(代表您实际的“暂存”或“实时”文件)
  • 1个本地仓库,您可以将裸仓库添加为远程仓库,以及可以推送到分段或生活的地方。
    您还可以将裸存储库克隆到需要处理的任何其他本地计算机。

post-receivepost-update挂钩之间的区别在于,对于每个修改过的分支执行post-update一次:
请参阅“Git hook to update various web folders based on branch pushed to remote server”SO问题。

在初始推送时,执行“git push --all origin”并在远程裸仓库上创建所有分支。

这个想法是服务器端不应该涉及:只有git --work-tree=/path/to/your/live/files/ checkout livegit --work-tree=/path/to/your/staging/files/ checkout staging,具体取决于更新后挂钩的参数:您只需检查裸仓库的文件进入服务器上的这些“文件夹”。

如果您为钩子执行ruby脚本,请确保:

  • 使用right shebang#!/usr/bin/env ruby
  • 使用反引号包围你的git命令就足够了:`git ...`like in this script
  • 使用ENV['HOME']指定所述脚本中当前用户的homedir,如果您希望`cd ~/stagedomain.com``--work-tree=~/stagedomain.com`等命令工作(将`~`设置为正确的道路),
  • 如果您选择git pull,则在同一行上取消设置GIT_DIR而不是其他命令like in your other question`cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage`