git 分离子仓库

将现有 git repo 中的子目录独立为新 repo,并保留其相关的提交历史。

git subtree

  1. 将 folder路径对应的所有提交信息 保存为一个新分支
git subtree split -P <folder> -b <new-branch>
  1. 将新分支保存为一个单独项目
mkdir <repo>
git init

git pull <path> <name-of-new-branch>

git filter-branch

1. 克隆一份项目到新路径, 并删除远程分支

git clone <big-repo> <new-repo>
cd <new-repo>
git remote rm origin

2. 过滤所有历史提交,只保留所有对指定子目录有影响的提交,并将该子目录设为该仓库的根目录

git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder> -- --all

--tag-name-filter 该参数控制我们要如何处理旧的 tag,cat 即表示原样输出;
--prune-empty 删除空的(对子目录没有影响的)提交;
--subdirectory-filter 指定子目录路径;
-- --all 该参数必须跟在 -- 后面,表示对所有分支进行操作。如果你只想保存当前分支,也可以不添加此参数。

3. 删除 历史提交中的 无用数据

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

4 清理原仓库中 分离的数据

git rm -rf <name-of-folder>
# 提交一下说明对应操作
git commit -m 'Remove some'
# 删除刚才创建的临时分支
# 后一种方法不需要执行这一步
git branch -D <name-of-new-branch>

5. 关联原仓库与新仓库

git commit -m "first commit"
git remote add origin <remote-path>
git push -u origin master
posted on 2023-04-24 11:10  listenerln  阅读(146)  评论(0)    收藏  举报