来自非嵌套/兄弟目录的Mercurial子存储库?

时间:2012-06-18 16:02:19

标签: mercurial mercurial-subrepos

是否可以使用兄弟路径创建子存储库?

Subversion是我们在这里“选择”的VCS,但我已经遇到了一些过时提交的问题。对我来说,在Hg和SVN下对我的文件进行双重版本更加方便,而且我已经取得了很大的成功。但是,我有一些其他同事使用Hg,我们在那里没有任何问题,除了他们可能没有注意到的。

我们的SVN布局如下所示

Area/
    trunk/
        Program1/
        Program2/
        ...
        Services/
            Program1ServiceA/
            Program1ServiceB/                

    branches/
        Program/
        Program/
        ...
        Services/
            Program1ServiceA/
            Program1ServiceB/                

    tags/
        Program1/
        Program2/
        ...
        Services/
            Program1ServiceA/
            Program1ServiceB/                

当你在一个项目上工作时,这会让你觉得很愚蠢,因为如果你的主项目由Program1Program2组成,还有一些服务...我不能一次性获取所有变更集,因为我们有一个与目录匹配的存储库。所以我必须确保4或5个repos同步,特别是对于一些服务引用。

我在一个目录下使用subrepos运气好了:

MainRepo/
    Subrepo1/
    Subrepo2/

但是我想要做的是指定一个相对路径,这样我就可以将兄弟目录用于子存储库,所以我可以这样:

Area/
    Project1/
        Program1/ (points to ../trunk/Program1)
        Program2/ (points to ../trunk/Program2)
        Service1/ (... You get the idea)
        Service2/

    trunk/
        Program1/
        Program2/
        Services/
            Service1/
            Service2/

但到目前为止它还没有像我预期的那样发挥作用。 trunk/Program1是一个Hg仓库,我的Project1/.hgsub文件包含

Program1 = ../trunk/Program1

我也试过../../trunk/Program1

但其中任何一个的结果都是创建了一个新目录:Area/Program1/Project1为空。

到目前为止,我能够找到的唯一搜索结果是使用http基于subrepos的存储库,所以我不知道从哪里开始。我们的开发环境是Windows 7,因此“简单”的答案是创建联结,但我主要关注的是让 easy 这样做,所以进入门槛尽可能低,甚至管理员cmd窗口中的mklink /J Program1 ..\trunk\Program1之类的东西也会阻止人们迁移到更好的工作流程。

是否可以添加我想要的子存储库,或者有更好的方法来完成我们正在做的事情吗?

1 个答案:

答案 0 :(得分:1)

子存储库在另一个存储库中始终。换句话说,子存储库允许您对存储库集合进行版本控制,其中某些存储库嵌套在其他存储库中。因此,如果不创建外部存储库,子存储库就不能成为兄弟姐妹。

当Mercurial需要找出 where 以从中获取新的子存储库时,会使用您正在讨论的相对路径。也就是说,当您运行hg update(或当它作为hg clone的一部分运行时)并且Mercurial注意到.hgsub文件时,它需要创建那里提到的子存储库。要创建子参数,Mercurial使用右侧的路径:

sub-A = relative/path
sub-B = C:/absolute/path

此处sub-A将使用命令

在工作副本的根目录中签出
hg clone <default path for main repo>/relative/path sub-A
使用命令

检出

sub-B

hg clone C:/absolute/path sub-B

这就是全部 - 这是一个非常简单的机制。我试图在my subrepository guide中对此进行描述,并在the wiki中进行了解释。

对于您的情况,您可以为属于一起的部分制作thin shell repository。此回购信息与上面的Project1类似,并且Program1Program2Service1等作为子回报。 .hgsub将如下所示:

Program1 = Program1
Program2 = Program2
Service1 = Service1
Service2 = Service2

通过使用“琐碎的subrepo路径”,您可以轻松实现:克隆看起来就像克隆源,所有内容都保存在一起。

最后一点:除非您在其他项目中使用Program1Service1,否则您应该将所有内容放入单个存储库中。