16

我的任务是将我的团队和源代码从 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

问题来自多个从事该项目的人。即使他们在 master 上工作,仍然会创建拆分和合并的分支。尽管如此,git-p4 还是勇敢地处理了这个问题:

A---B---C---E
     \--D--/

git p4 遍历 OK,按顺序提交 ABCDE(或 ABDCE,任一人的历史优先)。

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

使用索引信息重建基础树...
回退到修补基础和 3 路合并...
自动合并 main.cpp
CONFLICT(内容):在 main.cpp 中合并冲突
未能合并更改。
0005 更改主补丁失败

所以现在我被困住了。有没有办法清理 git 历史或让 git-p4 理解它?合并的存在令人沮丧。

我有过的想法:

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

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

4

4 回答 4

7

“扔掉旧历史”的选项并不像听起来那么糟糕:你可以将你的 git repo 永远放在它旁边,以防有人需要挖掘旧的东西。不幸的是,在 svn 和 p4 等旧式线性系统中,无法表示 git 对历史的复杂视图。

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

于 2011-02-05T19:37:49.743 回答
2

您检查过“裁缝”工具吗?它是为同步不同的 VCS:es 而构建的。它应该有 Perforce 支持。

作为旁注,我的第一反应是认真质疑这个决定,但我猜你已经这样做了。

于 2011-02-19T20:30:33.483 回答
0

你看过 Perforce Fusion 吗?

大约 7 到 8 年前,我有一个类似的问题,我们基本上将所有高级开发人员召集在一起,并告诉推动这个想法的经理,他已经失去了他的摇滚乐。

也就是说 - https://www.perforce.com/perforce/r15.3/manuals/git-fusion/

于 2021-01-06T09:26:21.280 回答
-2

我认为您应该尝试使用 Tortoise SVN,然后考虑单个分支更新,然后使用 Hg 或者您可以说迁移。确保您已克隆所有转储以确保安全。祝你好运 !

于 2010-12-22T15:12:13.040 回答