如何拆分Git仓库:归档分支保留全历史,主分支截断历史
Git仓库拆分方案:归档Branch B + 裁剪Branch A历史
嗨,这个需求可以通过Git官方推荐的git filter-repo工具(比老旧的filter-branch更稳定高效)来完美实现,分两个独立步骤处理,全程不会影响原仓库:
第一步:创建Branch B的归档仓库(完整8年历史)
这个仓库只保留Branch B的所有提交历史,其他分支和无关内容全部清理:
- 先克隆原仓库的镜像副本(避免操作原仓库):
git clone --mirror <原仓库的Git地址> branch-b-archive.git - 进入镜像仓库目录:
cd branch-b-archive.git - 使用
filter-repo只保留Branch B的历史:
(注意把git filter-repo --refs branch-bbranch-b换成你实际的Branch B分支名) - 现在这个仓库就只剩Branch B的完整历史了,推送到新的归档远程仓库:
git push --mirror <归档仓库的Git地址>
第二步:创建裁剪后的Branch A仓库(拆分提交作为新初始)
我们需要把拆分节点的提交变成新仓库的根节点,只保留Branch A及其子分支(dev/staging/prod)从该节点开始的历史:
先准备工作:找到拆分节点的提交哈希
运行下面的命令查看Branch A和Branch B的分支图,找到两者最后一次共享的提交(也就是去年拆分的节点):
git log --oneline --graph branch-a branch-b
记录下这个提交的哈希值,比如abc123,后面用SPLIT_COMMIT_HASH指代它。
开始裁剪仓库:
- 同样先克隆原仓库的镜像副本:
git clone --mirror <原仓库的Git地址> branch-a-trimmed.git - 进入镜像仓库目录:
cd branch-a-trimmed.git - 使用
filter-repo截断历史,将拆分提交设为新根节点,同时只保留目标分支:
解释:这个git filter-repo --parent-filter 'test $GIT_COMMIT != SPLIT_COMMIT_HASH || echo ""' --refs branch-a dev staging prod--parent-filter的作用是,当处理到拆分提交时,移除它的父提交,让它成为新仓库的根;其他提交保留原有的父子关系。--refs参数指定只保留我们需要的分支。 - 验证结果:运行
git log --oneline --graph,确认历史从拆分提交开始,且只有Branch A及其子分支的内容。 - 推送到新的远程仓库:
git push --mirror <新的Branch A仓库Git地址>
重要注意事项
- 备份优先:操作前务必备份原仓库,避免意外数据丢失。
filter-repo安装:如果你的Git没有自带filter-repo,可以通过pip install git-filter-repo安装(需要Python环境)。- 团队同步:裁剪后的仓库历史是重写过的,所有开发人员需要重新克隆新仓库,不能在旧仓库的分支上继续推送,否则会引发历史冲突。
内容的提问来源于stack exchange,提问作者Vlad Beu
相关产品推荐
相关产品推荐

