一个大仓库的初始推送的替代方法

10

我正在开发和生产一个相当大的Rails 3.1应用程序,并且我刚刚在Heroku上设置了一个演示环境。由于我的git仓库非常大,每次尝试推送时都会在大约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 文档

"例如,您可以将代码推送到暂存区,将其构建为 slug,然后将暂存区 slug 升级到生产环境。"

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


嘿,你可以把找到的新解决方案添加为答案吗?我还无法实现它。谢谢! - Chango
你可以在这里找到如何操作的简单文档:https://devcenter.heroku.com/articles/labs-pipelines - 在其他所有答案都无法解决问题时,它对我很有用。 - jfdimark
4个回答

8

我试图推送一些包含视频的更改,但遇到了以下问题:

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 

希望这能有所帮助。


6

另一种选择是将您的大型提交拆分成许多小提交。在此之前,请打标签或分支。每个提交将具有构成合理推送的文件数量。创建一个临时分支指向当前状态。现在将主分支重置为这些较小提交中的第一个。推送。将主分支设置为下一个提交。推送。重复此步骤直到完成。

现在将主分支恢复到最初的位置。您已经传输了对象。推送此大型提交不应重新发送已存在于远程的所有对象。


1
那听起来极其无聊。不过还是谢谢你。 - snowangel
呦。非常糟糕,但你要求提供另一种选择 ;) - Adam Dymitruk
1
我在使用 git:// 远程仓库时遇到了错误。我改用 git+ssh://,问题得到了解决。但是你的情况可能会有所不同... - Jean-Philippe Pellet
2
你可以通过检出相关提交并从中创建分支来避免更改主分支。然后,你可以使用 git push origin step1:master 将此分支推送到远程的主分支上。 - Luca Spiller

4
根据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

0

不,将内容上传到Heroku的唯一方式是通过git push。

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


我在生产环境中部署时的slug大小为72mb。在我的本地机器上,它是560mb,但这包括了sqlite3数据库和一些在.gitignore和.slugignore中忽略的其他文件。感谢您的回复 - 至少我知道没有简单的替代方法。 - snowangel
你的静态资源很多吗?也许将它们托管在S3上会更好? - John Beynon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接