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

Jan*_*nis 10 git git-push git-add git-remote

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

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

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

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

如何设置远程目录,以便我可以在本地将我的stage分支推送到staging remote server并立即查看(例如) 更改stage.example.com

那么一旦stage是所有好的和测试我也只是在本地能够pushlive远程做出这些改变,我在测试的stage实际网站.

甚至可以这样做,还是我在这里得到疯狂的想法,这些想法根本不是用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. --bare在遥控器上创建一个Git仓库(所以我可以从任何地方访问它)
  2. 将此远程仓库克隆到本地目录,并使用Gi​​t Tower应用程序对其进行管理
  3. 在当地工作 master (HEAD)
  4. scp -r--baregit repo从远程服务器复制到我的远程实时域stage.example.com
  5. 将远程添加到本地工作副本,然后尝试推送到 origin/stage

显然,这不起作用,但我不知道为什么或如何做得更好.

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

Von*_*onC 4

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

在您的情况下,暂存或实时是发布步骤,即不同的 Git 存储库准备好接收您想要在暂存或实时环境中看到的修改。

这意味着:

  • 2 个分支用于跟踪属于暂存(“ staging”分支)或实时(“ live”分支)的内容
  • 1 个远程裸仓库(为了能够推送到它,推送staginglive分支
  • 1 个用于裸存储库的更新后挂钩,以便签出和更新工作树(代表您实际的“暂存”或“实时”文件)
  • 1 个本地存储库,您可以在其中将裸存储库添加为远程存储库,并且可以在其中推送到暂存或运行。
    您还可以将裸存储库克隆到您需要使用的任何其他本地计算机。

post-receivea和hook之间的区别post-update在于,hook post-update对每个修改的分支执行一次:
请参阅“ Git hook to update keywords based onbranch Push to Remote server ”SO 问题。

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

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

如果您为您的钩子编写 ruby​​ 脚本,请确保:

  • 使用正确的 shebang : #!/usr/bin/env ruby,
  • 用反引号包围你的 git 命令应该足够了:`git ...`就像在这个脚本中一样
  • 如果您希望像或 那样的命令起作用(设置为正确的路径) ,则用于ENV['HOME']在所述脚本中指定当前用户的主目录,`cd ~/stagedomain.com``--work-tree=~/stagedomain.com``~`
  • 如果您选择这样做git pull,请GIT_DIR在与其他命令相同的行上取消设置,如您的其他问题`cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage`