Svn 多分支Mercurial存储库布局

Svn 多分支Mercurial存储库布局,svn,version-control,project-management,mercurial,Svn,Version Control,Project Management,Mercurial,我有一些准相关的项目,我想版本控制。在SVN中,我会将它们设置为单个项目中的多个目录 /scripts #updates in sync with project1 & project2 /project1 #requires database /project2 #requires database /database 当然,其他SVN布局也可以用于此玩具示例,但此布局具有以下优点: 我可以在分支之间复制文件,同时保留历史记录 我只能查看项目的一个子集,例如svn co repo

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

/scripts  #updates in sync with project1 & project2
/project1 #requires database
/project2 #requires database
/database
当然,其他SVN布局也可以用于此玩具示例,但此布局具有以下优点:

  • 我可以在分支之间复制文件,同时保留历史记录
  • 我只能查看项目的一个子集,例如
    svn co repo/project2;svn公司回购/数据库
    。 如果project1很大,这将节省大量的存储和时间
  • 轻松的存储库管理,因为所有项目都只定义一次用户访问权限
这一范式与mercurial没有很好的对应关系。所以我的问题是:在mercurial中存储大型、密切相关的项目最常见的方法是什么

我的想法是:

  • 多个存储库-丢失在项目之间移动的文件的历史记录
  • -似乎停止了,我不确定这个扩展有多稳定
  • 具有几乎不相关内容的命名分支
  • -不幸的是,我运行的是Ubuntu9.04,它只支持HG1.1.2。否则这看起来是个不错的选择

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

在我看来,最好的办法是将所有目录放在同一个存储库中,等待Mercurial特性允许签出子目录。子目录特性是Mercurial团队关心的一个特性,但它也不是微不足道的,这就是为什么它还没有被实现的原因。虽然我知道Mercurial的内部结构,但这绝对是可行的,只是需要做很多工作

第二个最好的选择,虽然我认为它很丑陋,是你提到的命名分支思想。不过,无论何时您想要在分支之间复制文件,您仍然需要执行一个非常奇怪的合并操作。您将执行以下步骤:

  • 更新到要将文件复制到的分支机构负责人:
    hg Update-C project1
  • 在要从中复制文件的分支中进行合并:
    HGMERGE=/bin/false hg Merge-r project2
  • 还原到要将文件复制到的分支的头:
    hg Revert-a--no backup-r project1
  • 从合并的in分支的头版本还原要复制的特定文件:
    hg Revert--no backup-r project2 path/to/file/in/project2.txt
  • 将文件移动到要复制到的分支中的相应位置:
    hg mv path/to/file/in/project2.txt project1/file/path/project2.txt
  • 将合并标记为已解决:
    hg resolve-am
  • 最后提交结果:
    hgcommit-m“将project2.txt复制到project1的合并。”
  • 就像我说的,非常难看。而且它可能只在HG1.3中工作得很好,因为我知道revert、merge和resolve交互中的一些重要错误最近已经修复。(恕我直言,我怀疑Ubuntu故意落后于非bzr版本控制系统的版本。)

    您真正希望在项目之间复制文件的频率是多少?为什么会这样?你确定失去历史会是件坏事吗


    我在Subversion中为自己的几个项目做过类似的事情,但我的经验是,我最初对某个项目真正归属的感觉通常是正确的,当它不保存历史时,其实没什么大不了的,因为历史实际上只与文件所在的原始项目相关。

    Wow,感谢命名的分支步骤。这太难看了。我会处理失去历史的问题——无论如何,这是一个相当罕见的案例。实际上,比在项目之间合并更改更大的问题是同步依赖项。即。project1@r50需要database@r50. 这可以用Svn完成,虽然它需要比我上面给出的稍微复杂一些的签出。同步依赖性正是SubRepos和森林所需要的。为了进一步阐述,我认为子副本和森林是一个VSN:而且,在Mercurial的思维模式下,元数据应该显式存储在文件中,而不是隐式附加到文件中,并使用专用VCS命令进行管理。