我正在处理一个在Heroku上托管的rails项目。我想知道是否可以在不重新启动应用程序的情况下更新一个文件。
为什么。我有一个bug,但我找不到它。它在我的本地系统上运行得很好,但在heroku上的处理过程中似乎中途停止了。
由于没有断点,我在代码中分散状态更新。(稍后删除)但在rails应用程序中添加一行代码就像五分钟的过程。
- 更改文件
- 暂存文件到git
- 提交文件
- 推git(以上都很快)
- 等待heroku关闭应用程序,进行看起来像gem的安装,或者至少进行gem更新
- 更改一些文件以反映本地url
- 再次启动服务
有没有一种方法可以在不运行所有其他东西的情况下推动git?也许是要添加到推送中的特殊参数?
更令人烦恼的是,我的git现在有一堆我不想让同事看到的签到单。我的目标是我自己的heroku的非生产实例(仅限测试),没有理由将所有这些尝试都包括在全局源代码管理中。
这是不可能的原因。当你推到Heroku时,他们会对你的应用程序产生"鼻涕虫"(https://devcenter.heroku.com/articles/slug-compiler)。为了提供Heroku提供的巨大可扩展性,这个段塞是只读的,这样它就可以在多个dynos上旋转,这些dynos可能分布在许多不同的物理机器上。这些dynos中的每一个都运行应用程序的一个单独实例,而路由网格确保对应用程序的请求到达正确的dynos。
现在考虑一下,如果这些实例中的任何一个是可写的,如果你运行5个dynos,你的应用程序将在5个单独的实例上运行,会发生什么?如果一个文件是写的,那么它是如何分布在你运行的dynos中的?是的,Heroku可以考虑使用某种共享文件系统来运行应用程序,但这很复杂。通过使文件系统只读(https://devcenter.heroku.com/articles/read-only-filesystem)这个问题得到了缓解。
如果你已经构建了一个应用程序并部署到Heroku,但忘记使用S3类型的潜望镜存储,你的应用程序会允许你上传文件到它(通过Ruby世界中的Paperclip等),但上传的资产只存在于收到它的dyno上,然后在部署新代码或当dyno从slug接收到最新代码时重新启动应用程序时就会丢失。
如果您正在针对Heroku进行调试,请不要忘记您有常用的git军火库git commit --amend
。或者,在一个分支中工作,并将其直接部署到Heroku(git push heroku <yourbranchname>:master
),然后当您隔离了问题时,重新建立基础(http://git-scm.com/book/en/Git-Branching-Rebasing)你的分支到master上,压缩你不再需要的任何提交。
XY问题
这是一个经典的XY问题。X是您的非工作代码;Y是您对不存在的Git错误功能的搜索。
Git的工作原理
Git基本上是在树级别提交工作,而不是在文件级别。作为一种过度简化,提交指向一个树,该树指向一组文件。当您推送提交时,您必须推送与该提交相关的所有对象,除非接收器上已经存在这些对象。
Heroku的工作原理
Heroku将Git存储库中的应用程序编译成一个slug。虽然您可以在编译过程中忽略某些文件,但无法避免编译段塞。这就是平台的工作方式。
如果你有一个合理的子弹大小,这不是问题;我的Heroku应用程序只需要几秒钟的编译时间。如果你的蛞蝓很大,因此需要很长时间才能编译(你声称这需要5分钟以上的时间),那么如果你试图解决"不要编译",你就有另一个XY问题了
在Heroku上调试
Heroku有很多功能和附加组件来帮助调试。这里有一个简短的清单,让你开始。
- 交互式控制台会话
- 测井
- 特殊附加组件
另请参阅
- https://devcenter.heroku.com/articles/read-only-filesystem
- https://devcenter.heroku.com/articles/dynos#ephemeral_filesystem
这是不可能的。按照heroku的设置方式,每次你进行更改时,服务器都会重新启动。
可以。
首先,列出自上次提交以来已修改的所有文件。
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