git拆分子目录作为新仓库并保留log记录和分支

1.将所有远程分支拉取到本地

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

2. clone 一份原仓库并删掉原来的 remote:(依次执行以下命令)

(1)git clone <big-repo>  <new-repo>
(2)cd <new-repo>
(3)git remote rm origin

3. 然后运行如下命令(这是重点):

(1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter – --all
这条命令同样会过滤所有历史提交,只保留所有对指定子目录有影响的提交,并将该子目录设为该仓库的根目录。这里说明各下个参数的作用:
–tag-name-filter 该参数控制我们要如何处理旧的 tag,cat 即表示原样输出;
–prune-empty 删除空的(对子目录没有影响的)提交;
–subdirectory-filter 指定子目录路径;
– --all 该参数必须跟在 – 后面,表示对所有分支进行操作。如果你只想保存当前分支,也可以不添加此参数。

4. 清理.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值