14

我正在开发一个托管在 Heroku 上的 Rails 项目。我想知道是否可以在不重新启动应用程序的情况下更新一个文件。

为什么。我有一个错误,但我无法追踪它。它在我的本地系统上完美运行,但它似乎在 heroku 处理的中途停止。

由于没有断点,我在代码中分散状态更新。(稍后将被删除)但是向 Rails 应用程序添加一行代码就像是一个五分钟的过程。

  1. 更改文件
  2. 暂存文件到 git
  3. 提交文件
  4. push git(以上都挺快的)
  5. 等待 heroku 拉下应用程序,执行看起来像 gem 安装的操作,或者至少进行 gem 更新。
  6. 更改一些文件以反映本地 url
  7. 再次启动服务。

有没有办法在不运行所有其他东西的情况下推送 git?也许是要添加到推送中的特殊参数?



更令人烦恼的是,我的 git 现在有一堆我不想让我的同事看到的签到。我的目标是我自己的非生产 heroku 实例(仅测试),没有理由将所有这些尝试包含在全局源代码控制中。

4

4 回答 4

28

有一个很好的理由说明为什么这是不可能的。当您推送到 Heroku 时,它们会生成您应用程序的“slug”(https://devcenter.heroku.com/articles/slug-compiler)。为了提供 Heroku 提供的大规模可扩展性,这个 slug 是只读的,以便它可以在多个可能分布在许多不同物理机器上的 dyno 上旋转。这些 dyno 中的每一个都运行您的应用程序的一个单独实例,而路由网格确保对您的应用程序的请求转到正确的 dyno。

现在考虑如果这些实例中的任何一个是可写的会发生什么,如果您正在运行 5 个 dyno,那么您的应用程序将在 5 个单独的实例上运行 - 如果一个文件被写入,那么它是如何分布在您正在运行的 dyno 上的?是的,Heroku 可以考虑使用某种共享文件系统来运行应用程序,但这很复杂。通过使文件系统只读(https://devcenter.heroku.com/articles/read-only-filesystem)这个问题得到缓解。

如果您已经构建了一个应用程序并部署到 Heroku,但忘记使用 S3 类型的永久存储,您的应用程序将允许您将文件上传到它(通过 Ruby 世界中的 Paperclip 之类的),但该上传的资产将仅存在于 dyno 上收到它,然后在部署新代码或重新启动应用程序时丢失,因为测功机从 slug 接收到最新代码。

如果您正在针对 Heroku 进行调试,请不要忘记您已经获得了常用的 git 库,git commit --amend. 或者在一个分支中工作并将其直接部署到 Heroku ( git push heroku <yourbranchname>:master) 然后当你隔离问题 rebase ( http://git-scm.com/book/en/Git-Branching-Rebasing ) 你的分支到 master 压缩任何提交你不再需要的。

于 2012-07-10T07:51:08.643 回答
3

XY 问题

这是一个经典的XY 问题。X 是您的非工作代码;Y 是您对不存在的 Git 错误功能的搜索。

Git 是如何工作的

Git 提交基本上在树级别工作,而不是文件级别。作为一个严重的过度简化,提交指向一棵树,它指向一组文件。当你推送一个提交时,你必须推送与该提交相关的所有对象,除非这些对象已经存在于接收器上。

Heroku 的工作原理

Heroku将 Git 存储库中的应用程序编译为 slug。虽然您可以在编译期间忽略某些文件,但您无法避免编译 slug。这就是平台的工作方式。

如果你有一个合理的蛞蝓大小,这不是问题;我的 Heroku 应用程序只需几秒钟即可编译。如果您的 slug 非常大,因此需要很长时间来编译(您声称这需要 5 分钟以上),那么如果您尝试解决“不编译”的问题,那么您手上还有另一个 XY 问题。

在 Heroku 上调试

Heroku 有很多特性和附加组件来帮助调试。这是一个简短的列表,可以帮助您入门。

也可以看看

于 2012-07-10T08:27:18.867 回答
2

这是不可能的。heroku 的设置方式,每次推送更改时服务器都会重新启动。

于 2012-07-10T04:10:53.370 回答
-2

是的你可以。

首先,列出自上次提交以来已修改的所有文件。

git status

添加要单独提交的文件。

git add location/file_name.rb git add location/file_name2.rb ...

提交您添加到推送的文件。

git commit -m "committing files one at a time or two at a time"

现在推

git push heroku

于 2012-07-10T01:58:40.710 回答