【发布时间】:2014-04-09 21:06:31
【问题描述】:
我有两个存储库,A 和 B。我想将A 中的所有文件及其历史子集复制到B。 B 有自己的历史文件,我也想保留这些文件;它不是一个全新的存储库。
你看,A 有 28,000 次提交。除了最近的30个左右,我不在乎。为简化讨论,假设我对提交 #1 到 #27,970 不感兴趣,但我想保留提交 #27,971 到 #28,000 的历史记录。
我尝试了两种不同的方法。
- 将
A(使用git rebase -i)中的#1 到#27,970 提交压缩为一个提交,然后将git pullA压缩为B。我在这里遇到的麻烦是在A的 rebase 期间,有很多关于 git 无法应用某些提交的错误。我对A中的这些提交一无所知,所以我无法修复它们。 (另外,执行 rebase 需要 很长 时间 - 好几个小时,我还没有完成。) - 在提交 #27,970 处下载
A的快照(即无历史记录)并将其放入B,然后对新文件执行git add和git commit。然后从A(使用git format-patch)为提交#27,971 到#28,000 创建一个补丁,并将该补丁(使用git apply)应用到B。这一切似乎都很好,除了它没有维护给定文件的提交历史。也就是说,在应用补丁后,所有 30 次提交的所有更改似乎都同时发生了:历史没有被保留。
必须有一个简单的方法来做到这一点!
【问题讨论】:
-
我可以想出许多不同的方法来做你想做的事,但我只会用我脑海中浮现的第一个最简单的方法来回答。另外,你基本上只是想创建一个新的 repo
B,它是A的克隆,但只是它最近的 30 次提交? -
@Cupcake 我编辑了我的问题:
B有自己的文件;它不是一个新的回购。 -
B包含哪些文件,它们与A中的文件有什么关系?如果它们是相同的文件但共享不同的历史记录(例如您在变基后会得到什么),那么当您将文件从A合并到B时,我不会对您最终遇到冲突感到惊讶。在解决这些冲突时要非常小心。
标签: git version-control git-pull