尝试批量推送大量提交

Trying to push large number of commits in batches

我正在处理一个需要从 Team Foundation Services 迁移到 Git 的超大型项目。我成功执行了本地转换,获得了 2800 多个需要推送到 github 的提交。其中一些提交非常大,一个简单的 git 推送在返回以下错误之前完成了大约 3%:

fatal: pack exceeds maximum allowed size

即将推出的包的大小似乎有大约 2.9gb 的限制。这似乎是合理的,所以我一直在 Whosebug 上搜索以了解如何将这些提交推上去。我换成使用 SSH,但错误仍然存​​在,但后来我在评论中看到了这行 GIT Bash 代码,它似乎是针对我想要的(分批发送提交):

max=$(git log --oneline|wc -l); for i in $(seq $max -500 1); do echo $i; g=$(git log --reverse --oneline --skip $i -n1|perl -alne'print $F[0]'); git push gh $g:refs/heads/master; done

挑战在于评论并没有真正提到这个命令是如何工作的,或者如何修改它以使其适用于我的情况。我按原样 运行 代码并收到以下错误:

'gh' does not appear to be a git repository

我想我知道我在做什么我尝试遵循 bash 代码的备用行:

max=$(git log --oneline|wc -l); for i in $(seq $max -500 1); do echo $i; g=$(git log --reverse --oneline --skip $i -n1|perl -alne'print $F[0]'); git push origin $g:refs/heads/master; done

此returns以下错误:

[remote rejected] master (refusing to delete the current branch: refs/heads/master)

很明显我做错了什么,但我对 Git Bash 的了解还不够多,不知道是什么。谁能帮我弄清楚我应该在那里输入什么?

git 分支结果:

max=$(git log --oneline|wc -l); for i in $(seq $max -500 1); do echo $i; git push origin master~$i:refs/heads/master; done; git push origin master

解释:

max=$(git log --oneline|wc -l)

这会列出当前分支中的所有提交并计算提交数。

for i in $(seq $max -500 1); do … done

运行 一个循环,分配 i 个数字,从 $max 到 1,在每个循环中递减 500。

git push origin master~$i:refs/heads/master

将旧提交推送到 master~$i。这是在递减 i 上面的循环中执行的,因此您可以推送 HEAD~10000HEAD~9500HEAD~9000 等提交,从而批量推送 500 次提交。

git push origin master

在推送所有提交后更新远程跟踪分支,以便它记住您已推送 master 中的所有提交。