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

如何拆分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-b
    
    (注意把branch-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:07:52