从git迁移到Perforce

Gra*_*rks 16 git perforce git-p4

我的任务是将我的团队和源码从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
Run Code Online (Sandbox Code Playgroud)

问题来自多个人在项目上工作.即使他们正在使用master,仍然会创建分割和合并的分支.不过,git-p4勇敢地处理了这个问题:

A---B---C---E
     \--D--/
Run Code Online (Sandbox Code Playgroud)

git p4遍历OK,按顺序提交ABCDE(或ABDCE,任何一个人的历史记录).

例如,当C和D都改变同一个文件时,问题就来了,而E是一个真实的诚实合并.git p4 rebase失败了; 它将回滚提交,但在回放期间它将首先应用C,然后尝试D并找到冲突.它会停下来,让我合并.好吧,E包含合并,但它要求我手动合并!'git p4 submit'将以类似的方式失败,只是现在它是p4拒绝合并前的更改.

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
Failed to merge in the changes.
Patch failed at 0005 Changing main

所以现在我被卡住了.有没有办法消毒git历史或让git-p4理解它?合并就在那里令人沮丧.

我有过的想法:

  • 使用git filter-branch删除所有提及的冲突文件.虽然缺少许多文件更改,但我会得到历史记录.在历史上大约有3000次提交,我最终会删除所有关键(繁忙)文件的历史记录.在过滤文件导入结束时,我会通过最终提交HEAD来添加丢失的文件.
  • 转储历史记录,执行HEAD的单个p4提交(简单但悲伤).
  • 不要转到p4:我已经尽可能长时间地实现了这个想法.

其中没有一个真的很棒.关于如何git'gt p4 rebase'或'git p4 submit'工作的任何想法?

ape*_*arr 6

"扔掉旧历史"的选择并不像听起来那么糟糕:你可以永远保持你的git repo,以防万一有人需要挖掘旧的东西.不幸的是,在svn和p4等旧式线性系统中,没有办法表示git复杂的历史观.

回顾旧历史的主要原因是'git annotate'(我假设p4有类似的工具).如果这就是你想要的全部,那么你真正想要做的就是将所有的合并提交压缩到只有一个父项(因此它们看起来像是一次提交而不是合并).这更像是svn和p4在他们自己的历史模型中记录的内容,其中合并看起来就像线性流中的单个提交.您可以使用git-filter-branch等来完成此操作.当然,这将失去在子分支上发生的所有历史......但是p4用户习惯于没有这些信息.