我有两个Git代码库,它们有某种联系。其中一个的内容是另一个的前身。我想以某种方式将代码库A的完整历史记录插入到代码库B之前,这样A的末尾就会成为代码库B的第一个变更集的父节点吗?它们两个的历史记录都相当线性。
这种操作是否可行?
我有两个Git代码库,它们有某种联系。其中一个的内容是另一个的前身。我想以某种方式将代码库A的完整历史记录插入到代码库B之前,这样A的末尾就会成为代码库B的第一个变更集的父节点吗?它们两个的历史记录都相当线性。
这种操作是否可行?
.git/info/grafts
),其中可以覆盖提交的父级关系(例如,将projectB
的第一个提交设置为projectA
的最新提交的父级)。skalee comments 关于文章 "Git: Grafting repositories"(来自SO用户Ben Straub)的具体示例。
现在我们想要做的是更改“
nuevo
”仓库中的第一个提交(“New commit #1
”),使其父提交为“old”仓库中的最后一个提交(“Old #3”)。是时候施展一些巫术了:
git fetch ../old master:ancient_history
[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