如何将refs拆分成多个命令推送的块?

时间:2015-12-08 11:01:29

标签: git github git-push

假设我有一个包含大量版本(标签)的存储库。存储库是有效的,git fsck什么都不报告。 但是当我通过ssh推送存储库时,我最终得到了remote: Internal Server Error

经过调查,这似乎是大量的裁判问题。我尝试过设置一个包含4100个分支的repo,消息更详细(很多failed to lock

重现步骤:将包含超过5000个引用的存储库推送到GitHub或GitHub企业的新空存储库。或只是fork this repo

有没有办法解决这个问题,而无需拆分回购以将其推入几个部分?

2 个答案:

答案 0 :(得分:1)

我在尝试推送一个大约有 50,000 个引用的存储库时遇到了同样的问题。 Github 支持人员表示,我唯一的选择是一次推送一小块引用。

这是我使用的命令行(如果您的引用位于不同的命名空间下,即 refs/replace,请使用它而不是 refs/heads)。

git for-each-ref --format="%(refname)" --sort='authordate' refs/heads | xargs git push origin

Shell 对命令行字符串的大小有限制,而 xargs 会智能地拆分命令以保持在该限制之下。我发现 Github 能够处理 xargs 一次推送的数量,但 YMMV。如果您仍然达到 Github 限制,请使用 max-args 选项(可能需要反复试验)。

git for-each-ref --format="%(refname)" --sort='authordate' refs/heads | xargs --max-args=<1000> git push origin

答案 1 :(得分:0)

很难重现,但我想这是服务器端的资源问题。也许是内存不足。

要验证这一点,您可以在另一个之后推送一个参考。从最古老的&#39;开始REF。这是历史上最早提交的引用。

使用refspec推送一个参考。例如。如果最旧的ref是名为v1.0.0的标记,那么

git push <REMOTE_REPO> refs/tags/v1.0.0:refs/tags/v1.0.0

如果有效,你可以继续使用一个小脚本。

git for-each-ref --format="%(refname)" --sort='authordate' refs/heads refs/tags | \
while read ref; 
do git push <REMOTE_REPO> $ref:$ref
done