Git | 如何在保留历史记录的情况下,把代码从一个仓库搬运到另一个仓库?

本文详细介绍了如何在保留历史记录的情况下,将Git仓库A中的一部分代码迁移到仓库B。通过使用git filter-branch的subdirectory-filter和index-filter,以及处理文件rename历史记录的方法,确保代码迁移的同时,保留完整的版本历史。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算是一篇踩坑记录,或者一篇爬坑教程吧

(之所以称之为坑,是因为大多数情况下,直接复制代码就完事了

需求

现有两个Git仓库,A和B,A是项目的主要仓库,为了方便管理,现在要把A中功能较为独立的一块代码搬运到B,同时,希望能够保留这部分代码的历史记录。

解决思路

最简单的情况

先不考虑其他因素,只考虑“把A仓库的代码和历史记录一起搬运到B仓库”这个需求,很快就能想到一个解决方案:

# Step 1: 克隆一份A的本地副本,以下操作均在该仓库A的本地副本内执行
git clone <repo A 的地址>

# Step 2: 将仓库B设置为该git本地仓库的一个远端
git remote add repoB <repo B 的地址>

# Step 3: 把不想搬过去的代码都删掉,并commit

# Step 4: 执行git push,把所有仓库A的历史记录推到仓库B的code-from-A分支
git push repoB --set-upstream HEAD:code-from-A

如果你要处理的只是一个内容简单的个人项目,那么以上操作就足以满足需求了。

然而,现实总是残酷的,实际的应用场景不会这么简单,我们还要考虑以下几个问题:

  1. 对于仓库B来说,它只关心要搬运的一小块代码,但是上面的做法却推了整个仓库A的历史记录上去,存在数据冗余

  1. 仓库B中,code-from-A分支与master分支不同基(not sharing the same base),因此,如果要把code-from-A merge到master,会报unrelated history的错。如果是个人项目的仓库还好,我们还可以通过配置allow unrelated history绕开这个问题,但在管理比较严格的企业里,这是不被允许的。这就迫使我们对code-from-A进行rebase。

  1. 如果仓库B并不是空白仓库,在rebase过程中极有可能发生c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值