【问题标题】:EC2 Rails Git Issues: First Push Worked, but Nothing Is Updating NowEC2 Rails Git 问题:第一次推送成功,但现在没有更新
【发布时间】:2014-02-22 00:40:09
【问题描述】:

我目前在我的本地 git 存储库上设置了一个 EC2 实例的远程。推送有效。

git push remote_name master
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (12/12), 896 bytes | 0 bytes/s, done.
Total 12 (delta 6), reused 0 (delta 0)
To user_name@dns:eko_web.git
4342c41..7bbc7db  master -> master

当我 ssh 进入远程 EC2 时,我可以找到我通过我的应用复制到 var/app/current/ 的第一个推送,但没有进一步的更新。当我查看我的裸 git repo 时,我会在我做 git show HEAD:<some_file> 时找到我最近的推送。当我在 var/app/current 中手动编辑视图时,更改不会反映在我的网站中;我只看到相同的初始推动。我在裸 git repo 的 post-receive 中有一个挂钩设置,如下所示:

#!bin/sh
GIT_WORK_TREE=/var/app/current git checkout -f

作为一个广泛的概述,我使用以下教程让我​​走到了这一步。 http://myrailslearnings.wordpress.com/2013/02/19/getting-ec2-to-use-git-for-rails-app/http://www.lovholm.net/2013/06/26/push-your-code-onto-your-ec2-instance-with-git/

感谢您对此的任何想法!

编辑:

根据 Rico 的建议,我启动了一个尚未使用 Beanstalk 初始化的新实例。我现在在实例上有一个 git repo,它(手动更新时)反映了服务器上的更改。但是我仍然无法远程推送到该位置;它显示成功推送,但文件在那里但未提交。如果我手动提交它们然后重新启动服务器,则网站会更新。

【问题讨论】:

  • 你服务器上的 git repo 是裸 repo 吗?裸仓库不保存文件,只保存提交历史记录,因此它不能用作工作树。您应该在服务器上执行 git clone。看来您正在重新发明轮子。 Rails 世界有一个部署代码的标准:看看github.com/capistrano/capistrano
  • 是的,git repo 是裸露的。但是 var/app/current 不是并且确实包含我的应用程序的完整版本;只是从第一次推动。要学习的东西太多了,我试图不让 AWS(之前只使用 Heroku)和部署工具 atm 不知所措。如果我 git clone 进入服务器,那么我会将 GIT_WORK_TREE 设置为该位置吗?我看不出它实际上是如何更新网站本身的......为什么它第一次工作?

标签: ruby-on-rails git amazon-web-services amazon-ec2


【解决方案1】:

您可以通过多种方式进行部署。可以通过直接推送到非裸 git repo 来进行部署,但这并不常见。 (就像http://www.lovholm.net/2013/06/26/push-your-code-onto-your-ec2-instance-with-git/ 描述的那样)有些事情你必须注意。例如,如果该分支恰好被签出,则您无法推送到远程存储库分支。

从外观上看,您最初是通过 Elastic Beanstalk 进行部署的,因为 /var/app/current 是它部署 Rails 应用程序的默认位置(当您执行 git aws.push 时)请记住,在常规Elastic Beanstalk 部署 /var/app/current 不包含 git 存储库。这只是你的代码的副本(git repo 保存在其他地方,我相信 S3)

从 git 部署的最常见方式是将 git 存储库放在 github、bitbucket 或云中的 git 存储库中。假设您使用 github。在部署时,您将推送到 github 存储库,然后通过从 github 存储库克隆或拉取到您的云服务器来部署新代码。 Capistrano 是自动化此过程的工具之一。

另一种部署方式是推送到您要部署的同一台 EC2 服务器中的裸 git 存储库,然后从该裸存储库拉/克隆到同一服务器中的另一个非裸存储库。

在您的情况下,如果您想在那里查看代码,您也可以尝试将远程存储库切换到非裸存储库。我猜最简单的方法是删除您的裸存储库,然后将原始存储库克隆为非裸存储库并将其粘贴到您要部署代码的位置。

【讨论】:

  • 感谢您如此彻底!我想我在这里错过了一个真正的基本概念。如果您可以填补空白或误解,那就太好了。 EC2 存在。它基本上是云中的计算机。当我们谈到通过从 github 下拉到云服务器进行部署时,云服务器是 EC2 实例吗?您提到的第二个潜在解决方案是将裸机拉/克隆到非裸机是有道理的。在这一点上,我的困惑是 EC2 如何知道特定的存储库是应该上线的存储库以及配置的位置。
  • 回答你的问题,是的。 EC2 实例通过其 git 配置了解远程 git 存储库。您可以通过git config -l 看到它。或者你可以看看.git/config的内容。如果您阅读了从 git 推送和拉取的基础知识,它可能会有所帮助。 git-scm.com/book/en/Git-Basics-Working-with-Remotes.
  • 我已经读过那页好几遍了;也许我没有清楚地表达我的困惑或者我误解了。如果我推送到 EC2 上的 github 存储库,当我没有告诉它时,EC2 如何将它自动推送到网络上?我是否不必告诉 EC2 我的应用程序存储在哪里,将其存储在特定位置,或者从该实例推送到另一个远程推送它?远程页面是有道理的,但是本地 repo -> ec2 repo -> web 让我对最后一步的实现感到困惑。
  • 它说我需要 20 个代表,你刚刚给我,但在聊天中似乎没有看到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2021-07-26
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
相关资源
最近更新 更多