我如何在 Git 中设置远程目录,我可以在其中将暂存分支本地推送到远程目录并在暂存服务器(例如 stage.example.com)上查看实时更改?
我的想法(我离开 SVN 的部分原因)是我可以(在本地)维护 3 个不同的“主要”分支,如下所示:
- master - 用于本地开发,工作目录
- stage - 应与暂存服务器目录(远程)同步
- live - 这应该是可公开访问的网站(远程)
我的想法(以及其他人声称的可能)是我可以从我的本地计算机维护这些远程“站点”,而不必经常登录到我的远程服务器 shell 并运行 svn update
(在我当前的 svn 工作流程中,我需要一直这样做……)或者当然在我的 Git 工作流程中,在远程运行 git pull
。
如何设置远程目录,以便我可以在本地将我的 stage
分支推送到 staging 远程服务器
并在 上查看更改(例如) stage.example.com
马上?
然后,一旦 stage
一切正常并经过测试,我就可以在本地push
到 live
远程进行这些更改我已经在实时网站的 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
此外,到目前为止,我未成功尝试了以下工作流程:
- 在远程创建一个
--bare
Git 仓库(这样我就可以从任何地方访问它) - 将此远程仓库克隆到本地目录并使用 Git Tower 应用程序对其进行管理
- 在本地工作
master (HEAD)
scp -r
将--bare
git repo 从远程服务器复制到我的远程实时域stage.example.com
<- 将远程添加到本地工作副本,然后尝试推送到
origin/stage
显然这行不通,但我不知道为什么或如何做得更好。
来自 SVN 背景,我是 Git 的新手,但看了很多教程(Peepcode 和 ThinkVitamin),但仍然不知道如何设置它。
最佳答案
使用 DVCS(“分布式”VCS,如 Git 或 Mercurial)实现的一个概念是它添加了 notion of publication (推/pull )到分支的概念。
CVCS(“集中式”VCS,如 SVN)只有分支(和一个要推送到服务器上的中央仓库)。
在您的情况下,暂存或实时是发布步骤,即准备好接收您希望在暂存或实时环境中看到的修改的不同 Git 存储库。
这意味着:
- 2 个分支来跟踪属于暂存(“
staging
”分支)或实时(“live
”分支)的内容 - 1 个远程裸仓库 ( in order to be able to push to it ,推送
staging
或live
分支 - 1 post-update hook对于裸仓库 in order to checkout and update a working tree (代表您实际的“暂存”或“实时”文件)
- 1 个本地存储库,您可以在其中将裸存储库添加为远程存储库,并且可以将其推送到暂存或上线。
您还可以将裸存储库克隆到您需要使用的任何其他本地计算机。
post-receive
和 post-update
Hook 的区别在于 post-update
对每个分支执行一次修改:
请参阅“Git hook to update various web folders based on branch pushed to remote server”SO 问题。
在初始推送时,执行“git push --all origin
”,所有分支都将在远程裸仓库上创建。
这个想法是服务器端不应该涉及 pull :只有 git --work-tree=/path/to/your/live/files/checkout live
或 git --work-tree=/path/to/your/staging/files/checkout staging
,取决于更新后 Hook 的参数:您只将裸仓库的文件 check out 到这些“文件夹”中服务器。
如果你为你的钩子(Hook)编写了一个 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`
。
关于git - 将 Git 分支直接推送到实时服务器目录中,以便实时查看文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520141/