【问题标题】:Mercurial repository layout for multiple branches [closed]多个分支的 Mercurial 存储库布局[关闭]
【发布时间】:2010-12-10 08:15:01
【问题描述】:

我有很多准相关的项目想要进行版本控制。在 SVN 中,我会将它们设置为单个项目中的多个目录

/scripts  #updates in sync with project1 & project2
/project1 #requires database
/project2 #requires database
/database

这个玩具示例当然也可以使用其他 SVN 布局,但这种布局有优势:

  • 我可以在分支之间复制文件,同时保留历史记录
  • 我只能签出一部分项目,例如svn co repo/project2; svn co repo/database。 如果 project1 很大,这可以节省大量存储空间和时间。
  • 易于存储库管理,因为所有项目的用户访问权限都定义一次

自从you can't clone a single directory of a mercurial repo 以来,这种范式不能很好地映射到 mercurial。所以我的问题是:在 mercurial 中存储大型、密切相关的项目最常用的方法是什么?

我的想法:

  • 多个存储库 - 丢失在项目之间移动的文件的历史记录
  • Forests - 似乎停滞不前,我不确定这个扩展有多稳定
  • 具有大部分不相关内容的命名分支
  • SubRepos - 不幸的是,我运行的是 Ubuntu 9.04,它只提供 hg 1.1.2。否则这看起来是个不错的选择

【问题讨论】:

    标签: svn version-control project-management mercurial


    【解决方案1】:

    多个存储库、Forests 和 SubRepos 都是同一个想法的变体。 Forests 和 SubRepos 只是让管理也使用其他项目的最新版本的项目更容易,它们并不能解决您遇到的基本问题,即在项目之间移动它们时会丢失文件历史记录。

    在我看来,最好的办法是将所有目录放在同一个存储库中,然后等待 Mercurial 功能允许签出子目录。子目录功能是 Mercurial 团队关心的一项功能,但它也不是微不足道的,这就是它尚未完成的原因。不过我知道 Mercurial 的内部结构,而且它绝对是可行的,只是需要做很多工作。

    虽然我认为它真的很难看,但第二个最佳选择是您提到的命名分支的想法。但是,只要您想在分支之间复制文件,您仍然需要执行一个非常奇怪的合并操作。您将执行以下步骤:

    1. 更新到要将文件复制到的分支头:hg update -C project1
    2. 合并到您要从中复制文件的分支:HGMERGE=/bin/false hg merge -r project2
    3. 恢复到要将文件复制到的分支的头部:hg revert -a --no-backup -r project1
    4. 从合并的分支的头版本中恢复要复制的特定文件:hg revert --no-backup -r project2 path/to/file/in/project2.txt
    5. 将文件移动到要复制到的分支中的位置:hg mv path/to/file/in/project2.txt project1/file/path/project2.txt
    6. 将合并标记为已解决:hg resolve -am
    7. 最后提交结果:hg commit -m "A merge to copy project2.txt to project1."

    正如我所说,非常丑陋。而且它可能只在 hg 1.3 中运行良好,因为我知道最近修复了一些重要的还原、合并和解析交互中的错误。 (恕我直言,我怀疑 Ubuntu 故意落后于非 bzr 版本控制系统的版本。)

    您真正希望在项目之间复制文件的频率是多少?为什么会发生?你确定失去历史会有那么糟糕吗?

    我在 Subversion 中为我自己的几个项目做过类似的事情,但我的经验是,我最初对某个项目真正属于哪个项目的感觉通常是正确的,而当它不保存历史时,我的感觉是错误的真的很重要,因为历史实际上只与文件所在的原始项目相关。

    【讨论】:

    • 哇,感谢指定的分支步骤。这太丑了,不值得考虑。我只会处理失去历史的问题——无论如何,这是一个相当罕见的案例。实际上,比合并项目之间的更改更大的问题是同步依赖关系。 IE。 project1@r50 需要数据库@r50。这可以使用 svn 完成,尽管它需要比我上面给出的稍微复杂的结帐。
    • 同步依赖正是 SubRepos 和 Forests 的用途。
    • 为了进一步详细说明,我认为 SubRepos 和 Forests 是 Mercurial 的 svn:externals 的实现,并且按照 Mercurial 的思维方式,元数据应该显式存储在文件中,而不是隐式附加到文件中,并且使用特殊用途的 VCS 命令进行管理。
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多