使用git filter-repo拆分子目录为独立仓库的路径与分支保留问题
Git 拆分子目录为独立仓库问题解决
1. git filter-repo 中 path-rename 参数的正确用法
path-rename 遵循原完整路径前缀:新路径前缀的匹配规则,前缀必须和你通过--path指定的过滤路径完全对应,不能只写部分路径片段:
- 如果你要把
MyProject/ANDROID下的所有内容直接放到新仓库的根目录(不保留ANDROID目录):git filter-repo --path MyProject/ANDROID/ --path-rename MyProject/ANDROID/:./ - 如果你要保留根目录下的
ANDROID目录层级,就是你后续用到的正确写法:git filter-repo --path MyProject/ANDROID/ --path-rename MyProject/ANDROID/:ANDROID/
你第一次执行失败的原因是path-rename的源路径只写了ANDROID/,和你过滤的完整路径MyProject/ANDROID/不匹配,所以重命名规则没有生效。
2. 保留所有和ANDROID相关的分支与标签的方法
你推送后只有master分支的核心原因是:克隆原仓库时默认只会拉取master分支到本地,其他远程分支、标签没有同步到本地,执行filter-repo时自然不会处理这些不存在的本地引用,推送也不会有内容。
按照以下步骤操作即可完整保留所有相关引用:
- 重新克隆原仓库,同步所有远程分支和标签到本地:
git clone git@bitbucket.org:myproject/my-repo.git cd my-repo # 拉取所有远程分支生成本地分支 for remote_branch in $(git branch -r | grep -v 'HEAD' | sed 's/origin\///'); do git checkout -b $remote_branch origin/$remote_branch; done # 拉取所有原仓库标签 git fetch origin --tags - 删除原远程地址避免误推送:
git remote rm origin - 执行
filter-repo路径过滤命令,工具会自动遍历所有本地分支、标签,仅保留存在MyProject/ANDROID路径修改的分支和标签:# 按需选择上面的路径重写规则,这里以保留根目录ANDROID为例 git filter-repo --path MyProject/ANDROID/ --path-rename MyProject/ANDROID/:ANDROID/ - 绑定新的远程仓库地址,全量推送内容:
git remote add origin <你的新仓库ssh/https地址> # 推送所有本地分支 git push --all origin # 推送所有本地标签 git push --tags origin
如果新仓库已经有初始提交,推送前可以先执行git pull origin master --allow-unrelated-histories合并后再推送即可。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

