代码之家  ›  专栏  ›  技术社区  ›  EricSchaefer

是否可以将MKS完整性存储库导入Git?

  •  10
  • EricSchaefer  · 技术社区  · 15 年前

    我只需要源树及其历史。我现在不关心需求/问题的内容。我在命令行中使用了一些技巧,以确定是否可以获得主干和一些开发路径的变更包列表。我认为应该可以为每个变更包提取一个diff,并使用它重放自Git中第一次提交以来的所有变更。像这样:

    1. 获取第一个提交并将其添加到Git
    2. 获取下一个CP
    3. 获取CP的差异
    4. 将diff应用于git工作目录
    5. 向Git添加并提交更改
    6. 重复(2.)直到最后一个CP

    你也可以用检查点来回复变更包(对我来说就足够了)。

    一个简单的方法是签出一个CP并添加/提交到Git。但随后您将失去对添加、删除、移动和重命名操作的跟踪。

    有人知道如何从“si diff”中获得统一的diff吗?这已经有很大帮助了。

    有什么想法吗?

    编辑2:
    添加了一个显示我是如何进行迁移的答案…

    5 回复  |  直到 8 年前
        1
  •  7
  •   Community M-A    7 年前

    问题在于 MKS Integrity 它们的唯一存储库 一切 住所:

    • 要求,
    • 测试计划,
    • 测试用例,
    • 特征,
    • 开发人员任务,
    • 部署请求

    因为这些数据可以以自己的速度彼此独立地发展,所以将它们全部导入到一个Git存储库中是一个坏主意:您只能克隆 全部的 git repo的内容(即使您可以限制该克隆的深度)。
    这意味着您将获得所有文档,即使您只是对代码感兴趣。
    mks完整性导出意味着要定义第一批要作为 submodules .


    我只需要源树及其历史。

    像往常一样,我只建议导入:

    • 主要标签(对于任何年龄超过一年的人,或任何你觉得舒服的时期,你都不需要进行全面检查,因为它太老了)
    • 过去几年的所有标签(主要和次要)。

    我不会全部导入 Git存储库,除非您确信您的所有源代表 作为一个整体开发的系统(而不是独立开发的几个“模块”)。

    一个简单的方法是签出一个CP并添加/提交到Git。

    这就是继续的方法。

    但随后您将失去对添加、删除、移动和重命名操作的跟踪。

    不!你不会!Git威尔 infer those operations .
    这是作为一个文件的优势 Content VCS .

        2
  •  9
  •   EricSchaefer    13 年前

    我不能发布我写的实际程序,因为我没有在自己的时间内完成。但是,我可以发布我是如何做到的。用任何脚本语言重做都应该很容易。 我编写的工具一次只迁移一个分支。我会告诉它我想要哪个分支(例如1.21.1),以及分支中的开始和结束修订(例如4和78会将所有修订从1.21.1.4迁移到1.21.1.78)。为了在一个repo中拥有所有分支,我将提供用于导入的.git目录。

    • 从开始修订到结束修订的循环
      • currentRev=分支循环计数器
      • 创建repo目录
      • 将.git目录移动到repo目录中
      • 将.gitignore文件移到repo目录中
      • chdir进入repo目录
      • 通过“si create sandbox-p mks_project_path--yes--projectrevision=currentrev”在repo目录中创建mks沙盒
      • 通过“si viewprojecthistory--rfilter=range:currentRev-currentRev”获取修订说明,捕获输出!
      • 从以前的输出中提取用户、日期、标签和注释
      • “Git Addi.”
      • 将从上面提取的信息通过管道传输到“git commit-qf-”(如果需要多行(如checkpoint注释),则不能执行-m操作)
      • 通过“si drop sandbox--yes index.pj”删除沙盒
      • 将.git和.gitignore移动到保存位置(用于下一次迭代)
      • 删除沙盒目录中的所有剩余文件
      • 移动到父目录(..)
      • 删除沙盒/repo dir
    • 创建最终Git目录
    • 将.git和.gitignore移到final git dir中
    • “Git重置--硬头”

    完成。

    mks对其字符串使用某种ASCII编码,而git通常使用utf-8,因此在将元数据导入git(用户名、注释、标记等)时要当心问题。

    对于更多分支,请执行以下操作:

    • 在git目录中,签出分支应在其中启动和创建分支的修订(“git checkout-b newbranchname”)。
    • 现在将.git和.gitignore移到保存位置并删除整个dir
    • 现在做和上面一样的事情

    还有一件事:“si”是mks命令行工具。因此,您要么需要指定它的完整路径,要么将它的路径放入搜索路径中。

        3
  •  6
  •   Kael    12 年前

    很遗憾,目前Si Diff不支持统一的Diff。有一个变更请求要求它这样做,但还没有太多的客户要求该功能。

    免责声明:我为PTC(谁获得了MKS)工作。

        4
  •  3
  •   Kyle Harrigan    12 年前

    这适用于检查点…

    https://gist.github.com/2369049

    不幸的是,从mks->git看来,检查点似乎是唯一真正有意义的东西,因为检查点实际上是最接近git调用commit的“快照”的东西。

    MKS有这么多不兼容的概念(每个文件版本的跟踪、分支与Git分支、检查点等完全不同),它们都可以彼此独立地发展,真的很难分辨如何将一个合理的历史迁移到Git中。可能有很多方法可以做到这一点,但没有一种方法比下一种方法更“正确”。

    也就是说,我想听听好主意。:)

    我希望看到一个以合理的方式捕获每个文件版本控制的解决方案。在一些讨论中,我们提出了这样一个想法,即通过提交时间或其他什么方式来排列每个文件版本的mks。这样,我们就可以通过包含多个文件更改的提交来制定“回购”的概念。

        5
  •  0
  •   Sam Liao    8 年前

    我使用这个工具将变更包从mks导入到mercurial,导入到git应该非常相似;或者您可以先导入到mercurial,然后使用git工具导入mercurial。

    https://github.com/arsane/py-mks2hg.git

    它将尝试找出指定项目下的所有变更包,并按顺序提交到新的Mercurial存储库。

    推荐文章