12

我只需要源代码树及其历史。我现在不关心要求/问题的东西。我用命令行玩了一下,以确定是否可以获得主干和一些开发路径的更改包列表。我认为应该可以为每个更改包提取一个差异,并使用它来重播自 git 中第一次提交以来的所有更改。像这样的东西:

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

您也可以用检查点替换更改包(对我来说已经足够了)。

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

有谁知道如何从“si diff”获得统一的差异?那已经很有帮助了。

有任何想法吗?

Edit2:
添加了一个答案,显示我实际上是如何进行迁移的......

4

5 回答 5

10

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

  • 从开始修订开始循环到结束修订
    • CURRENTREV=BRANCH.loopcounter
    • 创建回购目录
    • 将 .git 目录移动到 repo 目录中
    • 将 .gitignore 文件移动到 repo 目录中
    • chdir 进入 repo 目录
    • 通过 "si createdandbox -P MKS_PROJECT_PATH --yes --projectRevision=CURRENTREV 在 repo 目录中创建 mks 沙箱
    • 通过“si viewprojecthistory --rfilter=range:CURRENTREV-CURRENTREV”获取修订描述,捕获输出!
    • 从先前的输出中提取用户、日期、标签、评论
    • “混帐添加。”
    • 管道从上面提取的信息到“git commit -qF -”(如果你想要像检查点注释这样的多行,则不能执行 -m)
    • 通过“si dropsandbox --yes index.pj”删除沙箱
    • 将 .git 和 .gitignore 移动到保存位置(用于下一次迭代)
    • 删除沙盒目录中的所有剩余文件
    • 移动到父目录 (..)
    • 删除沙盒/repo 目录
  • 创建最终的 git 目录
  • 将 .git 和 .gitignore 移动到最终的 git 目录中
  • “git重置--硬头”

完毕。

MKS 对其字符串使用某种 ASCII 编码,而 git 通常使用 UTF-8,因此在将元数据导入 git(用户名、评论、标签等)时要注意问题。

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

  • 在 git 目录中签出分支应该开始的版本并创建一个分支(“git checkout -b NEWBRANCHNAME”)
  • 现在将 .git 和 .gitignore 移动到保存位置并删除整个目录
  • 现在做和上面一样的事情

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

于 2011-03-12T12:43:06.853 回答
8

MKS Integrity的问题在于其独特的存储库,其中包含所有内容

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

由于这些数据可以按照自己的节奏彼此独立发展,因此将它们全部导入一个 Git 存储库将是一个坏主意:您只能克隆 Git 存储库的所有内容(即使您可以限制该克隆的深度) )。
这意味着您将获得所有文档,即使您只是对代码感兴趣。
MKS Integrity 导出意味着首先定义多个 Git 存储库以充当子模块


我只需要源代码树及其历史。

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

  • 主要标签(对于超过一年的任何东西,或者任何您觉得舒服的时期,您都不需要全面检查,因为它太旧了)
  • 过去几年的所有标签(主要和次要)。

除非您确信您的所有源代码都代表一个整体开发的系统(而不是独立开发的几个“模块”) ,否则我不会在一个Git 存储库中导入所有内容

一种更简单的方法是检查一个 CP 并添加/提交到 git。

这将是继续进行的方式。

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

不!你不会!Git 会推断这些操作
这就是作为文件Content VCS的优势。

于 2009-08-21T21:29:09.167 回答
6

FWIW,si diff 遗憾的是目前不支持统一差异。有人要求更改以使其这样做,但尚未有太多客户要求该功能。

免责声明:我为 PTC(收购了 MKS)工作。

于 2012-07-09T19:34:49.610 回答
3

这适用于检查点...

https://gist.github.com/2369049

不幸的是,检查点似乎是唯一对 MKS -> GIT 有意义的东西,因为检查点实际上是最接近 GIT 称为提交的“快照”的东西。

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

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

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

于 2012-04-15T03:45:41.127 回答
0

我用这个工具从 MKS 中导入变更包到 Mercurial,导入到 git 应该是差不多的;或者您可以先导入 Mercurial,然后使用 git 工具导入 Mercurial。

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

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

于 2016-01-15T09:50:48.250 回答