【问题标题】:Alternative way to do an initial push of a large repo初始推送大型回购的替代方法
【发布时间】:2012-01-30 04:07:28
【问题描述】:

我有一个大型 Rails 3.1 应用程序正在开发和生产中,我刚刚在 Heroku 上设置了一个暂存环境。因为我的 git repo 非常大,所以每次尝试推送时都会出现大约 33% 的超时错误。

对于这个最初的巨大推动,除了git push staging master,还有其他选择吗?

错误信息是

EmBP-2:Appname Emma$ git push staging master
Counting objects: 17421, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6363/6363), done.
Connection to 10.10.18.33 closed by remote host.46 KiB/s    
error: pack-objects died of signal 13
error: failed to push some refs to 'git@heroku.com:appname-staging.git'

///////////////// 解决方案/编辑,几个月后......

如果您已经设置了将代码推送到的环境,那么现在有一种偷偷摸摸的方法可以解决这个问题,使用 Heroku 的(实验性)管道功能。来自 Heroku docs:

“例如,您可以将代码推送到 staging,将其内置到 slug 中,然后将 staging slug 提升到生产环境。”

Heroku 将现有 slug 从一个应用程序推送到另一个应用程序大约需要 5 秒!

【问题讨论】:

  • 嘿,您能添加新找到的解决方案作为答案吗?我还不能实现。谢谢!
  • 您可以在此处找到有关如何执行此操作的简单文档:devcenter.heroku.com/articles/labs-pipelines - 它对我有用,而所有其他答案都没有

标签: ruby-on-rails git heroku


【解决方案1】:

我试图通过视频推送一些更改并得到:

fatal: The remote end hung up unexpectedly
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.xxxx/XXX.git'

我的解决方案是:

git repack
git push 

希望这会有所帮助

【讨论】:

    【解决方案2】:

    另一种方法是将您的巨大承诺分解成许多小的承诺。在执行此操作之前标记或分支。每个都会有一些文件构成合理的推送。制作一个临时分支以指向尖端。现在将 master 重置为第一个较小的提交。推。将 master 设置为下一次提交。推。重复此操作直到完成。

    现在将 master 恢复到原来的位置。您已经转移了对象。推送这个大提交不应该重新发送远程已经存在的所有对象。

    【讨论】:

    • 这听起来非常无聊。不过,Ta。
    • 是的。非常恶心,但你要求另一种选择;)
    • 我在git:// 远程仓库中遇到了这个错误。我改成git+ssh://,效果很好。 YMMV…
    • 您可以通过签出有问题的提交并从中创建分支来避免更改 master。然后,您可以使用git push origin step1:master 将此分支推送到您的遥控器上。
    【解决方案3】:

    根据 Adam 的回答,您可以将包含许多提交(及其 blob)的大推送分解为多个较小的推送,每个小推送都包含分支历史所需提交的子集。

    我之前通过使用临时分支或标签来破坏完整的提交集来完成此操作,但我后来的尝试使用下面的内联脚本。我不必移动 HEAD 或修改索引或工作副本。

    您首先需要确定在每次推送的提交数量方面您的积极程度 - 每次推送的提交数量越多可能会稍微快一些,但遇到相同问题的风险更高。此外,由于您的提交将具有不同的大小,因此历史记录中的某些时期可能包含大于平均大小的提交,因此某些块可能会成功,而其他块则需要进一步拆分。您可能还会发现您有一个无法推送的提交,这需要不同的解决方案。

    要推送到新的远程分支master,请运行

    git log --reverse --oneline | sed -n '0~100p' | awk '{print "git push staging "$1":refs/heads/master"}' | while read i; do eval $i; done
    

    每次推送都会推送接下来的 100 次提交,并且只需要推送在该批提交中找到的新对象(或其增量)。最后,您需要推送当前的HEAD 以推送剩余的提交,并创建最终的远程分支:

    git push staging HEAD:master
    

    【讨论】:

      【解决方案4】:

      不,获取内容到 Heroku 的唯一方法是通过 git push。

      出于好奇,您的项目文件夹有多大?

      【讨论】:

      • 部署到生产环境时的 slug 大小为 72mb。在我的本地机器上,它是 560mb,但其中包括 sqlite3 数据库以及 gitignore 和 slugignore 中的一堆其他东西。感谢您的回复 - 至少我知道没有简单的选择。
      • 你那里有很多静态资产吗?也许将它们托管在 S3 上会更好?
      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2016-02-18
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2010-09-24
      相关资源
      最近更新 更多