尝试分批推送大量提交

时间:2018-07-10 14:24:01

标签: git github git-bash

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

fatal: pack exceeds maximum allowed size

似乎即将到来的包装的大小大约有2.9gb的限制。这似乎是合理的,所以我一直在Stackoverflow上进行搜索,以了解如何提高这些提交。我改用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

这将返回以下错误:

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

很明显,我做错了事,但是我对Git Bash的了解不足。有人可以帮我弄清楚我应该在那输入什么吗?

git分支结果:

  • 主人

1 个答案:

答案 0 :(得分:1)

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个提交进行推送。 / p>

git push origin master

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