< /块引用>
可以覆盖承诺的父级(如projectB
最新的projectA
)
也见“What are .git/info/grafts for?“和”How to prepend the past to a git repository?“更多关于这种操纵的信息。
skaleecomments关于文章”Git: Grafting repositories“(来自SO用户)Ben Straub)举个具体的例子。
现在我们要做的是更改__中的第一个提交nuevo
_157;回购(__New commit #1
_157;),使其父级是__old_157;repo(_156;old_3_157;)中的最后一个提交。伏都教时间:
git fetch ../old master:ancient_history
Git允许您从任何其他Git存储库中提取,无论此回购是否与之相关!精彩!这给我们留下了:
请注意我们如何将旧的主分支更名为古史。如果我们没有t,Git会试图合并这两个公司,可能会因为厌恶而放弃。
现在我们仍然有问题。
这两棵树是不相连的,事实上,一个git-pull根本就无法得到古代的历史分支。我们需要一种方法把两者联系起来。
Git有一个称为贪污的设施,它基本上是伪造两个提交之间的父链接。
要制作一个,只需在.git/info/移植物
此格式的文件:
[ref] [parent]
这两个都需要成为所讨论的提交的完整散列值。所以让我们找到它们:
$ git rev-list master | tail -n 1
d7737bffdad86dc05bbade271a9c16f8f912d3c6
$ git rev-parse ancient_history
463d0401a3f34bd381c456c6166e514564289ab2
$ echo d7737bffdad86dc05bbade271a9c16f8f912d3c6 \
463d0401a3f34bd381c456c6166e514564289ab2 \
> .git/info/grafts
(一行,如suggested通过ssokolow)
echo $(git rev-list master | tail -n 1) $(git rev-parse ancient_history) > .git/info/grafts
那里。现在我们的历史是这样的:
克隆此repo会导致:
胡扯。结果表明,嫁接仅对本地存储库有效。我们可以明智地运用git fast-import
:
$ git fast-export --all > ../export
$ mkdir ../nuevo-complete
$ cd ../nuevo-complete
$ git init
$ git fast-import < ../export
git-fast-import statistics: [...]
(一行,如suggested通过索科洛)
git filter-branch $(git rev-parse ancient_history)..HEAD
这有效地将我们的“假”历史链接转换为真实的历史链接。
所有的工程师都必须从这个新的存储库中重新克隆,因为散列将是不同的,但是这对于不需要停机和完整的历史来说是一个很小的代价。
ASQix评论below:
fast-import
似乎只是导入git信息,但不签出任何内容。
git init
原来你是大师,所以你需要一个git reset --hard HEAD
在你离开后实际检查文件快速导入
.