我需要将团队和源代码从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'工作呢?