git 尝试批量推送大量提交

5w9g7ksd  于 2023-06-20  发布在  Git
关注(0)|答案(2)|浏览(158)

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

fatal: pack exceeds maximum allowed size

似乎有一个大约2. 9 gb的限制大小的一个即将到来的包。这似乎是合理的,所以我一直在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分支结果:

fslejnso

fslejnso1#

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中推送了所有提交。

jyztefdp

jyztefdp2#

添加到@phd'回答:如果有合并提交,应该使用

git log --oneline --first-parent|wc -l

来计数提交。

相关问题