从Git迁移到Perforce

16

我需要将团队和源代码从Git迁移到Perforce,寻求如何将Git历史记录移动到p4的想法。

即使仅移动主分支,也有问题。

我使用了出色的git-p4工具。我在p4工作区中创建了一个目标区域,并使用git p4 clone //depot/StuffFromGit开始在git-p4中跟踪它。我将所有git仓库的更改嫁接到git-p4克隆版本中。然后可以使用git p4 submit提交并完成,所有更改都被推送到p4。

当Git历史记录呈现直线时,这样做很棒:

A---B---C---D

这个问题出现在多人共同开发项目时。即使他们都在主分支上工作,也会创建分支来进行代码的拆分和合并。不过,git-p4 能够勇敢地处理这个问题:

A---B---C---E
     \--D--/

git p4可以遍历,按顺序提交ABCDE(或ABDCE,每个人的历史记录都不同)。当C和D同时更改同一文件,E是一个真正的合并时,问题就出现了。这里'git p4 rebase'失败了;它会回滚提交,但在播放过程中,它会先应用C,然后尝试D并发现冲突。然后它会停止,并要求我进行合并。好吧,E包含合并,但它要求我手动合并!'git p4 submit'以类似的方式失败,只是现在是p4拒绝了预合并更改。

使用索引信息重构基本树…
回退到修补基础和三方合并……
自动合并main.cpp
冲突(内容):main.cpp中的合并冲突
未能合并更改。
补丁在0005修改主要部分时失败

那么现在我陷入了困境。有没有一种方法可以清理git历史记录或让git-p4理解它?令人沮丧的是,这些合并都已经存在。

我考虑过的想法:

  • 使用 git filter-branch 删除所有涉及冲突文件的提及。我将获得历史注释,但会缺少许多文件更改。由于历史记录中有大约3000个提交,我最终将删除所有关键(繁忙)文件的历史记录。在过滤文件导入结束时,我将通过进行HEAD的最终提交来添加缺失的文件。
  • 转储历史记录,对HEAD进行单个p4提交(简单但令人沮丧)。
  • 不转移到p4:我已经尽可能地尝试了这个想法。

这些方法都不是非常理想。有没有其他办法让'git p4 rebase'或'git p4 submit'工作呢?


16
考虑到Git的历史,朝着这个方向迁移有点有趣。 - T.E.D.
2
听起来像是git-p4试图合并C、D和E,当然惨败了。你检查过是否正在运行最新的git-p4,并且是否有一些补丁或其他人看到了同样的问题? - Jakob Borg
19
哇,伙计,我很抱歉。听起来你好像倒退了10-15年。 - Jonathan
2
这听起来很糟糕。你有没有重新基于历史的一部分?这可能会使导入变得更容易。 - Adam Dymitruk
1
愉快的结局更新!我在2013年离开了公司,从那时起一直在使用git :) - Graham Perks
显示剩余6条评论
4个回答

8
“仅仅扔掉旧历史记录”的选项并不像听起来那么糟糕:你可以永久将你的git仓库保留在旁边,以便于任何人需要查阅旧的内容。但遗憾的是,在像svn和p4这样的老式线性系统中,没有办法表示git复杂的历史视图。
回顾旧历史的主要原因是为了类似于“git annotate”(我假设p4有类似的工具)的东西。如果您只想要这些,那么也许您真正想做的是将所有合并提交压缩到它们的一个父级上(这样它们看起来像一个单一的提交而不是一个合并)。这更像是svn和p4在它们自己的历史模型中记录的,其中合并在线性流中只看起来像单个提交。您可以使用git-filter-branch或类似的方法实现这一点。当然,这会丢失发生在子分支上的所有历史记录...但p4用户已经习惯了没有这些信息。

Perforce通常不使用子分支,但如果您想管理分支,则可以使用它。然后信息就在那里。 - Br.Bill

2

你看过"tailor"这个工具吗?它是用于同步不同版本控制系统的。据说它支持Perforce。

顺便提一句,我的第一反应是严肃地质疑这个决定,但我猜你已经考虑过了。


0

-2

我认为你应该先尝试使用Tortoise SVN,然后再考虑使用Hg进行单分支更新或迁移。确保你已经克隆了所有的转储文件以保险起见。

祝你好运!


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