给Git仓库添加历史记录或合并Git仓库

9

每个人对于“合并Git仓库”都有不同的理解,这里是我的情况。我们有一个TFS仓库,在某个时间点我们将源代码检出,并进行了初始的git提交。然后我们在git中进行了正常的开发(分支、合并等等)。问题在于,新的仓库中我们没有git仓库的历史记录,我们希望修复这个问题。因此,我将整个TFS仓库转换为git仓库,现在我需要将转换后的TFS仓库与当前的git仓库合并。

从上述描述中可以明显看出,这些仓库从git的角度来看是独立的,但从逻辑角度来看它们有一个共同的提交(成为当前git仓库的初始提交)。

我如何合并这些仓库而不丢失它们的任何历史记录?我可以将转换后的TFS仓库作为基础,然后从当前仓库的主干(cherry-pick)挑选更改,但这样无法导入在当前仓库中创建的所有分支。

2个回答

3

编辑:我的先前答案没有带来任何好的结果。git rebase并不意味着要这样做。 然而,在stackoverflow上已经发生了类似的事情:合并两个git存储库以获取线性历史记录

您可以尝试使用以下步骤:

git init combined
cd combined
git remote add old url:/to/old
git remote add new url:/to/new
git remote update

您将拥有一个新的代码库,并参考两个代码库。然后:
git reset --hard old/master

这将使主分支指向旧仓库的主分支。现在,您可以从新仓库的主分支挑选所有提交。
git cherry-pick <sha-1 of first commit on new repo>..new/master

我们回到了起点:主分支没问题,但新仓库中的其他分支怎么办呢? 好的,您不再需要旧仓库了,所以...
git remote rm old

那么,假设你在新仓库中有一个名为“branch1”的分支。
git checkout branch1
git rebase master

这将更改branch1的历史记录,使其从包含导入库历史记录的主分支(合并后的主分支)开始,并且重新基础应该在没有冲突的情况下进行。 使用gitk检查历史记录是否一致,然后您可以使用force push命令强制推送。

git push -f new master
git push -f new branch1

在强制推送之前,您必须确保历史记录正确,因为这将更改上游的历史记录(请备份新旧仓库以便需要时恢复)。


“开放分支”是什么意思?难道后续的变基不会导致所有这些不同分支的提交都堆叠在一个分支上(oldmaster;假设没有冲突)? - Tomasz Grobelny
不,分支newrepo/master将被rebase以从oldmaster开始,然后是newrepo/branch1等。这假定在旧仓库中只有一个分支;通过“开放分支”,我指的是除主分支之外的所有分支,您希望在git存储库中进行rebase。最终结果应该是oldmaster的内容已经添加到新git存储库中的每个分支中。最终,在每次rebase之前,您需要切换到正在rebase的分支。(git checkout newrepo/branch1; git rebase oldmaster) - p91paul
新repo中的所有分支都来自最初导入到git的一个提交,所以我假设我只有一个“开放分支”,即使后来从这个起点创建了许多其他分支,对吗?但是我的oldrepo包含了一些过去稳定版本的分支,这会改变情况吗? - Tomasz Grobelny
我尝试了变基,但在旧仓库的第一个提交上失败了 - 这表明这里有严重的问题(可能是我不理解变基的工作原理)。 - Tomasz Grobelny
很抱歉耽搁了。不幸的是,它没有按预期工作。我收到了大量“错误:路径'path/to/file'的addinfo_cache失败”的消息。 - Tomasz Grobelny
显示剩余4条评论

0

这是我做的方式,不确定是否是正确的方式,但至少对我有效:

git clone url:/to/new
cd repo
git remote add old url:/to/old
git remote update
git rebase --committer-date-is-author-date old/master

就是这样了。现在如果有其他分支,也许你还需要将它们重新基于主分支进行变基,这可能并不那么简单。

新存储库的git历史变得扁平化,但对我来说,在查看git log -p --graph时这是可以接受的。

主要问题是我成为了新存储库所有提交的提交者。为了避免这种情况,您可以查看类似问题的答案,该答案使用git filter-branch --parent-filter而不是git rebasehttps://dev59.com/naHia4cB1Zd3GeqPauUP#44078243


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接