加入两个带有连续历史记录的git存储库

时间:2017-12-06 02:08:17

标签: git version-control git-merge

我有一个git存储库(称为此存储库A),用于接近公开发布的项目。随着时间的推移,存储库包含了我不想公开的信息(不是密码/ SSH密钥,但认为类似)。在过去的某个时刻(当我以为我们即将发布时),我通过运行git clone --depth=1创建了一个没有旧历史记录的新存储库(调用此存储库B)。在存储库A上没有发生任何开发,但是在存储库B上继续开发。现在我们实际上接近发布,我的老板想再次执行此操作,以创建存储库C.

我想将存储库A和B连接在一起,以包含一个“遗留”存储库,其中包含从项目开始到存储库C的第一次提交的整个历史记录。存储库A的最后一次提交和第一次提交存储库B具有相同的哈希值。 如何创建新的存储库AB,其中包含项目的整个历史记录,从第一次提交存储库A到最后一次提交存储库B

我尝试了以下内容:

  • 将回购B添加为回购A的远程,然后将fetchmerge B/master添加到A/master; git只报告Already up-to-date.,但HEADA/master仍在最后一次提交回复A.
  • 将repo A添加为repo B的远程,然后将fetchmerge B/master A/master添加到--allow-unrelated-histories,git仅在我使用{{1}时允许}。这只会产生一个巨大的合并冲突,自回购B开始以来,每个文件都被修改为冲突。我想如果我可以解决所有有利于回购B的冲突,这将是一个可接受的解决方案,但我不确定在这次合并之后历史树会是什么样子。

有没有更好的方法来做我想要完成的事情?

2 个答案:

答案 0 :(得分:0)

要将repo A和repo B与连续历史记录一起加入,您可以使用以下命令:

git clone <URL for repo A>
cd A
git remote add B <URL for repo B> -f
git reset --hard B/master

在本地仓库中,本地master分支包含所有顺序历史记录。如果要将本地仓库推送到仓库C,可以使用以下命令:

git remote set-url origin <URL for repo C>
git push -u origin master

答案 1 :(得分:0)

如果历史是字面顺序的,并且回购B是作为回购A(git clone --shallow <url of repo A>)的浅层克隆而制作的,那么你所要做的就是不浅薄的回复B:

$ cd path/to/repo/B
$ git fetch --unshallow origin

使B成为一个完整的(不再浅的)存储库,其中包含A中的所有提交,以及对B进行的任何其他提交。

另一方面,你谈到将回购A添加为回购B的远程 - 但是如果你用git clone --shallow做回购B,A应该已经一个遥控器。因此,您的问题描述中缺少某些内容。