1.将所有远程分支拉取到本地
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
- clone 一份原仓库并删掉原来的 remote:(依次执行以下命令)
(1)git clone <big-repo> <new-repo>
(2)cd <new-repo>
(3)git remote rm origin
- 然后运行如下命令(这是重点):
(1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter – --all
这条命令同样会过滤所有历史提交,只保留所有对指定子目录有影响的提交,并将该子目录设为该仓库的根目录。这里说明各下个参数的作用:
–tag-name-filter 该参数控制我们要如何处理旧的 tag,cat 即表示原样输出;
–prune-empty 删除空的(对子目录没有影响的)提交;
–subdirectory-filter 指定子目录路径;
– --all 该参数必须跟在 – 后面,表示对所有分支进行操作。如果你只想保存当前分支,也可以不添加此参数。
- 清理.git的object
当上述命令执行完毕后,就可以看到本地的新仓库已经是原仓库子目录中的内容了,且保留了关于该子目录所有的提交历史。不过只是这样的话新仓库中的.git 目录里还是保存有不少无用的 object,我们需要将其清除掉以减小新仓库的体积(如果你用subtree 的方法的话是不需要执行这一步的)。
依次执行以下命令:
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
5.将新的本地仓库推送到远端
cd到
(1)添加远端地址:
git remote add origin <new-git-url>
(2)推送到远端(推送所有分支):
git push --all origin -u
到这里,你就可以在远程新仓库看到新提交的代码,里面包含了原仓库的所有commit记录和分支。
参考资料:
https://blog.csdn.net/toopoo/article/details/85260277