合并Git仓库

时间:2019-04-15 15:18:48

标签: git merge

我有两个要合并的存储库。让我们称它们为旧样式和新样式。我的团队于2016年12月31日停止使用旧样式,而于2017年1月1日开始使用新样式。目录/项目样式已从旧样式复制并移至新样式,但历史记录除外。我想将这两个历史合并在一起,以便可以看到项目中发生了什么变化。

我该怎么做?许多博客建议采用旧样式,并使其成为新样式的子目录,然后合并它们无关的历史记录。但是我相信我的历史是相关的。这样做会使代码库看起来不相似。

old-style: c1--c2--c3--c4--c5 <- master
January 1 2017  
new-style: c1--c2--c3--c4--c5--c6-- <- master

如果我将旧样式作为新样式的子目录,则必须进行提交以指示在某个时刻发生了合并。

old-style: c1--c2--c3--c4--c5 <- master
             January 1 2017  \
                   new-style: c1'--c2'--c3'--c4'--c5'--c6'--c7 <- master
message at c7 indicating that old-style was added to new-style

理想的输出是

c1--c2--c3--c4--c5--c1'--c2'--c3'--c4'--c5'--c6'--c7-- <- master

2 个答案:

答案 0 :(得分:1)

我找到了对我有用的解决方案。所有这些都需要在GitBash中完成,而不是在Powershell中完成。

您将需要知道新样式存储库的第一个提交哈希值和旧样式存储库的最后一个提交哈希值。

在新型克隆中运行

git rev-list --max-parents=0 HEAD

输出

2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

在旧式克隆中运行

git rev-parse HEAD

输出

de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3

克隆新型存储库

git clone https://GitWebsite.repos/new-style.git
cd new-style

将老式存储库添加为远程存储库

git remote add history https://GitWebsite.repos/old-style.git
git fetch history

现在要转换分支,我将使用git-filter-branch。我了解此功能的工作方式类似于TFVC的工作方式。您正在为提交拍摄快照并向前移动,而不使用提交之间的差异。 Git不会尝试在两次提交之间进行任何解析。这让我想起了华莱士和格罗米特的电影《错的裤子》,在火车追逐场景中,格罗米特(Grommit)在向前行驶时在火车前放置了跟踪装置。

git filter-branch --parent-filter 'test $GIT_COMMIT = 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12 && echo "-p de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3" || cat' HEAD

现在很多小时后完成。您可以强制将此存储库推送到您的git主机。

git push -f

您现在应该在单个线性历史记录中看到代码。

非常感谢这个答案 https://stackoverflow.com/a/44078243/2375884

答案 1 :(得分:0)

您的理想情况图描述了可以进行的重新配置。如果您将这两个存储库作为分支,则可以运行git rebase --root --onto old-style new-style,这将产生线性历史记录。

如果--rebase-merges是主要开发分支,它使用典型的合并工作流来保留合并提交而不是忽略合并提交,则您可能还想使用new-style。这需要一个合理的最新Git版本。

如果您确实要使用合并,则需要与--allow-unrelated-histories合并,因为分支在共享代码时不会共享实际的公共提交。