题
我的任务是将我的团队和资源从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遍历确定,按顺序(或ABDCE,首先是ABDCE)进行ABCDE。
问题出现在例如C和D都更改相同文件的情况下,而E是真实的良好性合并。 git p4 rebase
在这里失败;它会倒带提交,但是在播放期间,它将首先应用C,然后尝试D并找到冲突。然后会停止,要求我合并。好吧,E包含合并,但它要求我交手! “ git p4提交”将以类似的方式失败,直到现在是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个提交的情况下,我会删除所有密钥(忙)文件的历史记录。在滤波器导入的末尾,我会通过执行头部的最终提交来添加丢失的文件。
- 抛弃历史,做一个头部的P4提交(简单但悲伤)。
- 没有移至P4:我已经尽可能长时间地努力了。
这些都不是很棒。关于如何git“ gt p4 rebase”或“ git p4提交”的任何想法?
解决方案
“只是扔掉旧历史”的选择并不像听起来那样糟糕:您可以永远将git repo保留在它的旁边,以防任何人都需要挖掘旧东西。不幸的是,在SVN和P4等老式的线性系统中,无法代表Git对历史的复杂看法。
回顾旧历史的主要原因是诸如“ git注释”之类的东西(我认为P4具有类似的工具)。如果这就是您想要的,那么也许您真正想做的就是将所有合并挤压为他们的一个父母(因此他们看起来像是单一的提交而不是合并)。这更像是SVN和P4在他们自己的历史模型中录制的内容,在该模型中,合并看起来像是在线性流中的单一提交。您可以使用git-filter-branch等做到这一点。当然,这将失去子分支机构上发生的所有历史……但是P4用户习惯于没有这些信息。
其他提示
您是否检查过“裁缝”工具?它是为了同步不同的VCS:ES的构建。它应该有punderce-support。
作为旁注,我的第一个反应是认真质疑该决定,但我想您已经做到了。
我认为您应该尝试使用Tortoise SVN,然后考虑单一分支更新,或者您可以说迁移。确保将所有克隆的垃圾箱都放在安全的一侧。祝你好运 !