我有两个Git代码库,它们有某种联系。其中一个的内容是另一个的前身。我想以某种方式将代码库A的完整历史记录插入到代码库B之前,这样A的末尾就会成为代码库B的第一个变更集的父节点吗?它们两个的历史记录都相当线性。
这种操作是否可行?
我有两个Git代码库,它们有某种联系。其中一个的内容是另一个的前身。我想以某种方式将代码库A的完整历史记录插入到代码库B之前,这样A的末尾就会成为代码库B的第一个变更集的父节点吗?它们两个的历史记录都相当线性。
这种操作是否可行?
.git/info/grafts),其中可以覆盖提交的父级关系(例如,将projectB的第一个提交设置为projectA的最新提交的父级)。
另请参阅".git/info/grafts是什么?"和"如何在git存储库中添加过去的提交记录?"以了解更多相关操作。
skalee comments 关于文章 "Git: Grafting repositories"(来自SO用户Ben Straub)的具体示例。
现在我们想要做的是更改“
nuevo”仓库中的第一个提交(“New commit #1”),使其父提交为“old”仓库中的最后一个提交(“Old #3”)。是时候施展一些巫术了:
git fetch ../old master:ancient_history
Git可以从任何其他git存储库获取数据,无论这个存储库是否与它有关!太棒了!这让我们得到了这个:

[ref] [parent]
这两个都需要是相关提交的完整哈希值。因此,让我们找到它们:
$ git rev-list master | tail -n 1
d7737bffdad86dc05bbade271a9c16f8f912d3c6
$ git rev-parse ancient_history
463d0401a3f34bd381c456c6166e514564289ab2
$ echo d7737bffdad86dc05bbade271a9c16f8f912d3c6 \
463d0401a3f34bd381c456c6166e514564289ab2 \
> .git/info/grafts
echo $(git rev-list master | tail -n 1) $(git rev-parse ancient_history) > .git/info/grafts
现在我们的历史记录如下:


糟糕,看来移植只对本地仓库生效。我们可以通过巧妙地应用
git fast-import来解决这个问题:
$ git fast-export --all > ../export
$ mkdir ../nuevo-complete
$ cd ../nuevo-complete
$ git init
$ git fast-import < ../export
git-fast-import statistics: [...]
git filter-branch $(git rev-parse ancient_history)..HEAD
这实际上将我们的“伪造”历史链接转换为真正的链接。
fast-import似乎只是导入 git 信息,但不会检出任何内容。
git init最初将您放置在主分支上,因此在执行fast-import后,需要使用git reset --hard HEAD来实际检出文件。
git filter-branch重写历史记录,以使移植带来的更改永久化...但这会重写历史记录。 - Jakub Narębskigit reset --hard HEAD,因为fast-import不会帮你检出主分支的头部(所以立即执行git status会显示你删除了一切)。 - Qix - MONICA WAS MISTREATED