【问题标题】:Is it possible to do a partial clone/branch with either bazaar, mercurial or git?是否可以使用 bazaar、mercurial 或 git 进行部分克隆/分支?
【发布时间】:2023-03-11 12:43:01
【问题描述】:

假设我有一个包含很多子目录的源代码控制项目,其中很多我目前不需要。

我想创建一个只包含整个树的一部分的工作副本,它仍然保持进行更改、提交和推送它们的能力。

这可能吗?如果可以,我该怎么做?

我仍在决定是选择 bazaar 还是 mercurial,因此有关其中任何一个的答案都会有所帮助。

编辑:实际上,git 的解决方案也很有用。

【问题讨论】:

    标签: git version-control mercurial bazaar


    【解决方案1】:

    据我所知,无法克隆树的子集,但还有其他可能性。

    Git:命令git clone 有一个--depth 标志:

    --depth <depth>

    创建一个浅克隆,其历史被截断为指定的修订数。浅层存储库有许多限制(您不能克隆或从中获取,也不能从中推送或进入),但如果您只对历史悠久的大型项目的近期历史感兴趣,并且想要将修复作为补丁发送。

    Bazaarcheckout 命令的标志--lightweight 仅下载工作目录而不是整个历史记录,并节省带宽和磁盘空间。仍然支持所有操作,但需要网络连接才能执行这些操作。

    不知道 Merurial 有没有这个功能。

    【讨论】:

      【解决方案2】:

      如果您已经有一个存储库并且您想这样做,那将会很痛苦。

      如果您打算使用全新的存储库执行此操作,您可能需要查看 Mercurial 的新 subrepos

      基本上你为某些目录创建独立的存储库:

      myproject/
          .hg/
          source code/
              ... files here ...
          documentation/ (subrepo)
              .hg/
              ... files here ...
          graphics/ (subrepo)
              .hg/
              ... files here ...
      

      这将项目的不同部分隔离在不同的存储库中。 “包含”存储库(在本例中为 myproject)会在您每次提交时跟踪子存储库的修订版本。我提到的 subrepo wiki 页面解释得很好。

      【讨论】:

        【解决方案3】:

        this wiki page 来看,Mercurial 中尚未实现此功能,但是有一个extension 可以通过“转换”存储库或其部分而不是实际分支来大致完成您想要的操作。由于它可以从汞转换为汞,因此它可以用作部分克隆。这是你需要的吗?

        【讨论】:

        • 这是一个有用的答案,但请注意重要的警告:hg convert 允许您仅克隆存储库的一部分,是的,但变更集不会具有与相同的 SHA-1 ID原始版本中的变更集。尽管您可以尝试手动管理移植回您所做的更改(例如使用hg transplant),但您不能推回原始存储库(至少不安全)。虽然对于长期克隆来说并不理想。
        【解决方案4】:

        在大多数 DCVS 中,规则是“1 个项目 == 1 个存储库”。没有“子项目”的概念(与 Subversion 不同,您可以签出子树并进行处理)。

        主要原因是您的“项目”在根文件夹中包含整个存储库的副本。如果您可以在子文件夹中创建整个存储库的副本,事情会变得相当复杂。

        从好的方面来说,创建工作副本是一种快速操作(除非底层文件系统很慢)。

        【讨论】:

          【解决方案5】:

          在 git 中,您可以使用 git subtree,它允许您为特定子项目提取“虚拟”存储库,然后在子项目中进行更改,然后将这些更改合并回来。

          【讨论】:

            【解决方案6】:

            对于 Bazaar,您有嵌套树:http://bazaar-vcs.org/NestedTreesDesign,它允许您将大项目拆分为子项目。
            这个功能我还没用过,不知道效果如何。

            您还可以使用 --hardlink 进行分支以避免复制一堆文件(不确定它是否适用于 Windows...)、没有历史记录的分支(较轻的分支)或没有工作树的分支(没有文件,只有历史记录) .

            【讨论】:

            • 其他 DVCS 也支持这一点:它是 Git 中的 git-submodule,我认为是 Mercurial 中的 Forest 扩展。但我认为,这与原始发帖人所问的内容无关,因为它需要预先进行额外设置。
            • 我链接到的页面中提到了这些。我刚刚尝试过:在现有测试树上使用拆分,提交更改,然后分支子树,它工作。至少对于 bzr 而言,无需预先这样做。
            • @Jakub:你不需要 Forest 扩展任何 mroe -- 在 1.3 中将 SubRepos 添加到 Mercurial 核心。
            猜你喜欢
            • 2011-05-15
            • 2012-01-22
            • 1970-01-01
            • 2011-05-29
            • 1970-01-01
            • 2021-06-26
            • 2019-01-07
            • 2011-05-31
            • 2010-10-01
            相关资源
            最近更新 更多