我的任务是将我的团队和资源从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,然后考虑单一分支更新,或者您可以说迁移。确保将所有克隆的垃圾箱都放在安全的一侧。祝你好运 !

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top