试图批量推送大量提交

Cha*_*IIC 3 git github git-bash

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

fatal: pack exceeds maximum allowed size
Run Code Online (Sandbox Code Playgroud)

即将推出的包的大小似乎有大约 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
Run Code Online (Sandbox Code Playgroud)

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

'gh' does not appear to be a git repository
Run Code Online (Sandbox Code Playgroud)

想我知道我在做什么我尝试以下 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
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误:

[remote rejected] master (refusing to delete the current branch: refs/heads/master)
Run Code Online (Sandbox Code Playgroud)

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

git 分支结果:

  • 掌握

phd*_*phd 6

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
Run Code Online (Sandbox Code Playgroud)

解释:

max=$(git log --oneline|wc -l)
Run Code Online (Sandbox Code Playgroud)

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

for i in $(seq $max -500 1); do … done
Run Code Online (Sandbox Code Playgroud)

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

git push origin master~$i:refs/heads/master
Run Code Online (Sandbox Code Playgroud)

将旧提交推送到master~$i. 这在循环以上减少执行i这样你推提交像HEAD~10000HEAD~9500HEAD~9000等因此通过500个提交在分批推提交批量。

git push origin master
Run Code Online (Sandbox Code Playgroud)

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