代码之家  ›  专栏  ›  技术社区  ›  Graham Perks

从git迁移到Perforce

  •  16
  • Graham Perks  · 技术社区  · 14 年前

    我很乐意只搬走师父的树枝。然而,事实证明,即使这样也存在问题。

    我用的是很棒的git-p4工具。我在p4工作区中创建了一个目标区域,并使用 git p4 clone //depot/StuffFromGit git p4 submit 完成后,所有更改都会推送到p4。

    A---B---C---D
    

    问题出在多人参与这个项目上。即使它们正在处理master,仍然会创建分裂和合并的分支。尽管如此,git-p4还是勇敢地处理了这个问题:

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

    git p4遍历OK,按顺序提交ABCDE(或者ABDCE,先提交两个人的历史记录)。

    例如,当C和D都更改同一个文件时,问题就出现了,而E是一个真正的诚实与善良的合并。 git p4 rebase

    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分支删除所有提到的冲突文件。我会把历史记录的注释弄清楚,尽管我遗漏了很多文件更改。历史记录中大约有3000个提交,我最终会删除所有密钥(繁忙)文件的历史记录。在过滤文件导入的末尾,我将通过执行头的最终提交来添加丢失的文件。
    • 抛开历史,做一个单一的p4头承诺(简单但悲伤)。
    • 不要移到第4页:我已经尽可能长时间地考虑了这个想法。

    这些都不是很好。关于如何让“gt p4 rebase”或“git p4 submit”生效有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  7
  •   apenwarr    14 年前

    “扔掉旧历史”的选择并没有听起来那么糟糕:你可以把你的git回购协议永远放在它旁边,以防有人需要挖掘旧的东西。不幸的是,在svn和p4这样的老式线性系统中,根本无法表达git复杂的历史观。

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

        2
  •  2
  •   Rawler    14 年前

    顺便说一下,我的第一反应是认真质疑这个决定,但我想你已经这么做了。

        3
  •  -2
  •   Nav    14 年前

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

    推荐文章