注意 !!!
进行 git 仓库操作时 源仓库建议将所有分支锁定 目标仓库建议拉取独立分支操作 其他分支锁定
环境准备
- macos
- git版本要求 >= 2.22.0
- homebrew
1. 使用 homebrew 安装 git-filter-repo
brew install git-filter-repo
# 安装完成后 执行brew ls 查看是否安装成功
2.源仓库根目录迁移到目标仓库/a/b文件夹下
- 源仓库 git url
http://testa.git - 源分支
feature-a - 源目录
/ - 目标仓库 url
http://testb.git - 目标分支
main - 目标目录
/a/b
备注解释:
将源仓库中的根目录下所有文件迁移到目标仓库 /a/b 文件夹下,并保留所有 commit
2.1 克隆源仓库指定分支
git clone --branch feature-a http://testa.git
命令解释:
克隆源仓库的指定分支 feature-a
注意克隆完后在这个仓库不要进行任何操作
2.2 进行 commit 裁剪处理
# cd 到克隆下来的文件夹
cd ./testa
git filter-repo --to-subdirectory-filter a/b
命令解释:
为当前分支根目录下的所有文件 commit 路径增加/a/b 前缀
/a/b 也就是你要迁移的仓库目录
2.3 添加远程仓库进行推送
# 推送前用idea或者vscode查看修剪后的git仓库
# 增加git remote 地址
git remote add source http://testb.git
# 查看远程仓库地址是否添加成功
git remote -v
# 结果应该是
# source http://testb.git (fetch)
# source http://testb.git (push)
# 拉取source远程仓库的目标分支的代码
git pull --no-rebase --allow-unrelated-histories source main
# 然后会进入命令行编辑器界面 输入提交信息后 按一下esc键 输入 :wq 保存退出
# 推送裁剪后的commit到source远程仓库 main分支
git push source HEAD:main
# 迁移完毕 进入目标仓库中查看
3. 源仓库/a/b目录下的所有文件迁移到目标仓库/c/d文件夹下
- 源仓库 git url
http://testa.git - 源分支
main - 源目录
/a/b - 目标仓库 url
http://testb.git - 目标分支
main - 目标目录
/c/b
备注解释:
将源仓库中的/a/b下所有文件迁移到目标仓库 /c/d 文件夹下,并保留所有 commit
3.1 克隆源仓库指定分支
git clone --branch main http://testa.git
命令解释:
克隆源仓库的指定分支 main
注意克隆完后在这个仓库不要进行任何操作
3.2 进行 commit 裁剪处理
# cd 到克隆下来的文件夹
cd ./testa
git filter-repo --subdirectory-filter a/b
git filter-repo --to-subdirectory-filter c/d
命令解释:
- 将 b 文件夹下所有文件提取到根目录
- 为当前分支根目录下的所有文件 commit 路径增加/a/b 前缀
3.3 添加远程仓库进行推送 步骤同 2.3
其他
brew 卸载 git-filter-repo
brew uninstall git-filter-repo
brew autoremove
brew cleanup