【问题标题】:Git/GitHub import from SourceAnywhere从 SourceAnywhere 导入 Git/GitHub
【发布时间】:2013-01-07 05:53:11
【问题描述】:

我们目前使用SourceAnywhere Hosted 作为我们的版本控制服务器。我正在寻求迁移到 GitHub,并且真的很想保留我们 8 年多的历史。

是否有其他人成功完成此迁移并愿意分享他们的工具/流程?

现在,假设以前没有这样做过,我想我正在考虑使用 SourceAnywhere SDK 或命令行客户端编写一个 git fast-import 脚本。作为 git 新手,是否有任何现有的脚本或资源可以指导我作为起点?

【问题讨论】:

    标签: git github git-fast-import


    【解决方案1】:

    我终于清理了我的项目并将其添加到 GitHub。你可以在这里找到它:SAWHtoGit

    它在将历史导出到逻辑变更集方面做得很好,但有一些小限制:

    • 由于 SourceAnywhere API 的限制,任何已在 SourceAnywhere 中删除的文件都不会导入历史记录。
    • 只要您提供旧/新目录的映射,任何被“移动”的文件都可以导入。

    除此之外,它对我们的目的很有效,我们能够成功地将我们的代码和历史迁移到 GitHub。我希望它对其他人也有用!

    【讨论】:

    • 很好的反馈,除了我的回答。 +1
    【解决方案2】:

    导入部分很简单:
    从初始存储库中提取一致文件集后,您可以将其添加到 git 存储库中,该存储库将检测任何修改/添加/删除。

    "Coherent" = 一组代表稳定状态的文件,例如 "which compiles":这些时间点通常由标签表示,尤其是在像 SAW 这样的文件级别工作的 repo 中(而不是git,它在存储库级别工作,每个修订代表 full repo 的 content

    在 git 中添加一组文件很简单:

    git --work-tree=/path/to/extracted/file --git-dir=/path/to/git/repo/.git add -A
    git --work-tree=/path/to/extracted/file --git-dir=/path/to/git/repo/.git commit -m "new revision from SAW import"
    

    困难在于确定要导入的内容。
    我建议列出所有标签,并使用它们来获取 GetProject -label 中的所有项目(使用 SAW CLI

    请注意,每个项目都应该在自己的 Git 存储库中:这将避免大型臃肿的存储库,这将难以克隆,而不是使用 SAW 的集中式模型,您可以将所有项目放在一个引用中。


    OP Dancomments:

    我能够使用 SourceAnywhere COM SDK 编写一个小实用程序来提取我的历史记录(在 SDK 允许的范围内)并编写一个快速导入脚本以将其全部加载到 git 中。
    虽然并非每个中间变更集都一定是“连贯的”,但最终结果与我们当前的状态相匹配,并且我们保留了大部分历史记录。

    【讨论】:

    • 谢谢!听起来你以前做过这个:) 我们不使用标签,但我认为GetProjectHistory -prj $/ -v 会给我“连贯”的时间戳,我可以用于GetProject -time。不过,我想保留/映射用户和签入描述,而且这种方法似乎不允许这样做?注释虽然显示在 GUI 中,但似乎没有出现在 CLI 中。
    • @Dan 这种方法允许吗?不容易。不要忘记 git 没有身份验证 (stackoverflow.com/a/5685757/6309),因此您附加到提交(项目全部内容的修订)一个名称(提交者名称)。如果您的GetProjectHistory -prj $/ -v 向您显示一个由多个贡献组成的状态,您将无法在附加多个名称的情况下导入它。请记住:您导入的是所有内容,而不是某些文件。 Git 不能逐个文件地工作(与其他较旧的集中式 VCS 不同:stackoverflow.com/a/645771/6309)。
    • 感谢您的帮助!虽然我没有完全使用您的解决方案(GetProject -time 没有像我想的那样工作),但它为我指明了正确的方向。我能够使用 SourceAnywhere COM SDK 编写一个小实用程序来提取我的历史记录(在 SDK 允许的范围内)并编写一个 fast-import 脚本将其全部加载到 git 中。虽然并非每个中间变更集都一定是“连贯的”,但最终结果与我们当前的状态相匹配,并且我们保留了大部分历史记录。我确实计划将来清理我的代码并在 GitHub 上分享。
    • @Dan:太好了。我已将您的评论包含在答案中以提高知名度。
    • 谢谢!我终于发布了我的解决方案并添加了详细信息的答案。欣赏正确方向的指针!
    【解决方案3】:

    您可以查看其他 git-over-XYZ 实现是如何工作的。例如,here's the code for git-svnhere's the code for git-cvsimport(都在 Perl 中)。

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 2010-11-07
      • 2021-10-02
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-12-09
      • 2015-06-25
      相关资源
      最近更新 更多