我有两个存储库,A
和B
。我想将A
中包含其历史记录子集的所有文件复制到B
。 B
有自己的历史文件,我也想保留;它不是一个新的,新的存储库。
你看,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 - 很多小时,我还没有完成。)A
的快照(即没有历史记录)并将其放在B
中,然后为新鲜git add
和git commit
新文件。然后从A
(使用git format-patch
)创建一个补丁,用于提交#27,971到#28,000,并将该补丁(使用git apply
)应用于B
。这一切似乎都运行正常,除了它没有维护给定文件的提交历史。也就是说,在应用补丁后,似乎所有30次提交的所有更改都会立即发生:历史记录未被保留。必须有一个简单的方法来做到这一点!
答案 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
我强烈建议您先测试另一个克隆。