尝试批量推送大量提交
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~10000
、HEAD~9500
、HEAD~9000
等提交,从而批量推送 500 次提交。
git push origin master
在推送所有提交后更新远程跟踪分支,以便它记住您已推送 master
中的所有提交。
我正在处理一个需要从 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~10000
、HEAD~9500
、HEAD~9000
等提交,从而批量推送 500 次提交。
git push origin master
在推送所有提交后更新远程跟踪分支,以便它记住您已推送 master
中的所有提交。