如何从git中的另一个存储库中提取一系列提交?

时间:2014-04-09 21:06:32

标签: git version-control git-pull

我有两个存储库,AB。我想将A中包含其历史记录子集的所有文件复制到BB有自己的历史文件,我也想保留;它不是一个新的,新的存储库。

你看,A有28,000次提交。除了最近的30个左右,我都不在乎。为了简单讨论,让我们说我对提交#1到#27,970不感兴趣,但我想保留提交#27,971到#28,000的历史记录。

我尝试了两种不同的方法。

  • 壁球将A中的#1到#27,970次提交(使用git rebase -i)提交到一次提交,然后git pull A提交到B。我在A的rebase期间遇到的麻烦,git无法应用某些提交时出现了很多错误。我对A中的这些提交不了解,所以我无法修复它们。 (另外,它需要很长的时间来执行rebase - 很多小时,我还没有完成。)
  • 在提交#27,970下载A的快照(即没有历史记录)并将其放在B中,然后为新鲜git addgit commit新文件。然后从A(使用git format-patch)创建一个补丁,用于提交#27,971到#28,000,并将该补丁(使用git apply)应用于B。这一切似乎都运行正常,除了它没有维护给定文件的提交历史。也就是说,在应用补丁后,似乎所有30次提交的所有更改都会立即发生:历史记录未被保留。

必须有一个简单的方法来做到这一点!

1 个答案:

答案 0 :(得分:2)

所以我研究了两种可能的选择来做你想要的。其中一个是制作repo A浅层克隆,但根据the documentation

  

浅的存储库有许多限制(你不能克隆或获取它,也不能从中推送或插入它),但如果你只对历史悠久的大型项目的近期历史感兴趣,那么就足够了。希望将修补程序作为补丁发送。

无法执行基本的网络选项,例如从浅层回购推送和获取听起来像一个非常大的限制,所以我认为下一个选项可能对你更好。您可以尝试从提交master~29开始创建 孤立分支 ,而不是进行浅层回购,然后在其上方重新提交master~28..master

git checkout --orphan root master~29
git add .
git commit -m "Add your message here"

这将启动您的孤儿分支,新的根提交包含提交master~29的历史状态。接下来,您将要将后代提交重新绑定在顶部(这将保留历史记录,但提交日期除外,由于rebase而必须更新):

git rebase --preserve-merges --onto root master~29 master
# or `-p` for short
git rebase -p --onto root master~29 master

这将在新根之上重建剩余的master,同时还保留任何合并提交。如果你想确认这个新版本的master与旧版本相同,只是历史较短,那么只需在rebase之后立即做一个差异:

git diff master@{1} master

我强烈建议您先测试另一个克隆

Documentation for orphan branches