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'gt p4 rebase'或'git p4 submit'工作的任何想法?
"扔掉旧历史"的选择并不像听起来那么糟糕:你可以永远保持你的git repo,以防万一有人需要挖掘旧的东西.不幸的是,在svn和p4等旧式线性系统中,没有办法表示git复杂的历史观.
回顾旧历史的主要原因是'git annotate'(我假设p4有类似的工具).如果这就是你想要的全部,那么你真正想要做的就是将所有的合并提交压缩到只有一个父项(因此它们看起来像是一次提交而不是合并).这更像是svn和p4在他们自己的历史模型中记录的内容,其中合并看起来就像线性流中的单个提交.您可以使用git-filter-branch等来完成此操作.当然,这将失去在子分支上发生的所有历史......但是p4用户习惯于没有这些信息.