10

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

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

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

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

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

然后,一旦stage一切正常并经过测试,我就可以在本地push远程live进行我stage在现场网站上测试过的这些更改。

这甚至可以完成还是我在这里得到了根本不适合用 Git 完成的疯狂想法?

如果这很重要,这里有一些关于我的本地和远程服务器的统计信息:

远程服务器:Dreamhost(共享账号)
远程 Git 版本:1.7.1.1
远程 GIT 客户端:shell

本地电脑:Mac Pro (Snow Leopard 10.6.6)
本地 Git 版本:1.7.2.3
本地 GIT 客户端:Tower.app // git-tower.com

另外,到目前为止,我还没有成功尝试过以下工作流程:

  1. 在遥控器上创建一个--bareGit 存储库(这样我就可以从任何地方访问它)
  2. 将此远程存储库克隆到本地目录并使用 Git Tower 应用程序对其进行管理
  3. 在当地工作master (HEAD)
  4. scp -r--bare将git repo 从远程服务器复制到我的远程实时域stage.example.com
  5. 将远程添加到本地工作副本,然后尝试推送到origin/stage

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

来自 SVN 背景,我是 Git 新手,但看过很多教程(Peepcode 和 ThinkVitamin),但仍然不知道如何设置它。

4

1 回答 1

4

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

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

那将意味着:

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

post-receivea和post-update钩子 之间的区别在于post-update,每个修改的分支都会执行一次:
请参阅“ Git 钩子根据推送到远程服务器的分支更新各种 Web 文件夹” SO 问题。

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

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

如果你为你的钩子做一个 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`
于 2011-04-02T06:01:16.290 回答