You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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时自然不会处理这些不存在的本地引用,推送也不会有内容。
按照以下步骤操作即可完整保留所有相关引用:

  1. 重新克隆原仓库,同步所有远程分支和标签到本地:
    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
    
  2. 删除原远程地址避免误推送:
    git remote rm origin
    
  3. 执行filter-repo路径过滤命令,工具会自动遍历所有本地分支、标签,仅保留存在MyProject/ANDROID路径修改的分支和标签:
    # 按需选择上面的路径重写规则,这里以保留根目录ANDROID为例
    git filter-repo --path MyProject/ANDROID/ --path-rename MyProject/ANDROID/:ANDROID/
    
  4. 绑定新的远程仓库地址,全量推送内容:
    git remote add origin <你的新仓库ssh/https地址>
    # 推送所有本地分支
    git push --all origin
    # 推送所有本地标签
    git push --tags origin
    

如果新仓库已经有初始提交,推送前可以先执行git pull origin master --allow-unrelated-histories合并后再推送即可。


内容的提问来源于stack exchange,提问作者Vicky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:15:04