如何在不破坏文件历史记录的情况下组合多个Git存储库?

Sco*_*ord 6 git tfs git-tfs

我们正试图远离TFS.使用git-tfs工具,我们能够迁移现有仓库的一部分,但在某些麻烦的签入时崩溃了.我们已经能够制作一套拼凑的Git repos,它涵盖了大多数原始TFS提交.

目前有:

  • Git回购从2009年到2011年的变化
  • Git repo从2011年到2016年的变化
  • Git回购从2016年到现在的变化

期望:

  • Big Git回购涵盖2009年至今
  • 任何存在于整个时间的文件都只有一个文件历史记录

我们有什么方法可以将它们拼接成一个Git仓库吗?我们不关心保留SHA(它们都是新的),但我们无法破坏文件历史记录.

Phi*_*ppe 5

编辑:最近版本的 git 现在扩展了git replace命令以更轻松地使用git replace --graft <commit> <parent>(参见https://git-scm.com/docs/git-replace#Documentation/git-replace.txt---graftltcommitgtltparentgt82308203


使用 git 的“嫁接”功能有一种简单的方法可以做到这一点。这是一个与git replace@torek 提到的目标相同的功能,但在您的情况下更容易使用。

首先,导入同一存储库中的所有历史记录。在最近的存储库中,为另外 2 个执行:

  1. git remote add c:/path/toward/other/repository
  2. git fetch

然后.git/info/grafts按照帮助创建 git 移植文件:https : //git.wiki.kernel.org/index.php/GraftPoint (您的文件中应该有 2 行)

如果您使用git log或任何 Git GUI,您现在应该可以看到您想要的历史记录。

如果您满意,则重写历史记录以使其具有确定性:

git filter-branch

您现在可以将历史记录推送到中央存储库或共享它。

Ps:关于该主题的另一个文档,但融合移植并替换 git 功能:https : //legacy-developer.atlassian.com/blog/2015/08/grafting-earlier-history-with-git/