将存储库推送到新的远程,一次提交一次

Push repository to new remote, one commit at the time

我正在将存储库移动到新主机,由于不幸的历史原因,签入了很多大文件(cocoa pods、图像)

虽然我已经使用 Git BFS 将大小减小到 940mb(从 2.4GB),但它仍然不足以支持推送到我们内部部署的 BitBucket 服务器。

所以我想从一个特定的历史点开始一个一个地推送提交。该存储库最初是从 SVN 移植的,并在那个时间点打破了 Git 树(大约 5 年前有一个图表有一个坚实的突破)

它只有 4000 次提交,所以一个一个地推送是合理的,但是我找不到一个好方法从 一个给定的 ref 推送 ,而不是 给定的参考

那么,有没有办法从 commit-hashcommit-hash (在我的例子中,HEAD)推送到一个(新)远程端点?

正如我在评论中所建议的那样,一次推送一个提交的小脚本可能会起作用。从服务器的角度来看,它看起来像是有人在处理项目,不断提交和推送。

在 bash 中,这应该有效:

for c in $(git log --pretty=format:"%h" --reverse --first-parent origin/master..master); do 
    git push origin $c:master
done

--first-parent 是必需的,因此它不会在合并时中断。我在本地试了一下,结果是这样的:

tobi@TOBIAS-PC:/mnt/d/test/git/r$ git log --oneline --graph --decorate
* d2d3264 (HEAD -> master) asdaskdj
*   9171144 Merge branch 'something'
|\
| * f85e25e (something) opjsdfk
| * 069b6f1 bla
* | f3c54df kjsdaflk
* | ca354e5 kjsdaflk
|/
* 6765170 asdf
* c1873cc (origin/master) initial commit


tobi@TOBIAS-PC:/mnt/d/test/git/r$ git log --pretty=format:"%h" --reverse --first-parent origin/master..master
6765170
ca354e5
f3c54df
9171144
d2d3264


tobi@TOBIAS-PC:/mnt/d/test/git/r$ for c in $(git log --pretty=format:"%h" --reverse --first-parent origin/master..master); do git push origin $c:master; done
Counting objects: 3, done.
Writing objects: 100% (3/3), 235 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../b
   c1873cc..6765170  6765170 -> master
Counting objects: 3, done.
Writing objects: 100% (3/3), 244 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../b
   6765170..ca354e5  ca354e5 -> master
Counting objects: 3, done.
Writing objects: 100% (3/3), 244 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../b
   ca354e5..f3c54df  f3c54df -> master
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 762 bytes | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To ../b
   f3c54df..9171144  9171144 -> master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../b
   9171144..d2d3264  d2d3264 -> master


tobi@TOBIAS-PC:/mnt/d/test/git/r$ git log --oneline --decorate --graph
* d2d3264 (HEAD -> master, origin/master) asdaskdj
*   9171144 Merge branch 'something'
|\
| * f85e25e (something) opjsdfk
| * 069b6f1 bla
* | f3c54df kjsdaflk
* | ca354e5 kjsdaflk
|/
* 6765170 asdf
* c1873cc initial commit

您可能还想添加一个睡眠,以防服务器因所有这些推送而不堪重负,从而给它一些时间来处理所有这些数据;我真的不知道它是否除了将它存储在磁盘上之外还有什么作用,它可能会索引它或其他东西。