【问题标题】:Mercurial subrepository from a non-nested / sibling directory?来自非嵌套/同级目录的 Mercurial 子存​​储库?
【发布时间】:2019-09-11 19:37:43
【问题描述】:

是否可以使用同级路径创建子存储库?

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 的子存储库,所以我不确定从这里去哪里。我们的开发环境是 Windows 7,所以“简单”的答案是创建联结,但我主要关心的是让这样的事情容易做,所以进入门槛尽可能低,甚至像管理员 cmd 窗口中的 mklink /J Program1 ..\trunk\Program1 这样简单的操作也会阻止人们迁移到更好的工作流程。

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

【问题讨论】:

    标签: mercurial mercurial-subrepos


    【解决方案1】:

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

    当 Mercurial 需要找出 哪里 来获取新的子存储库时,会使用您所说的相对路径。也就是说,当您运行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。这个 repo 就像上面的 Project1 一样,并且有 Program1Program2Service1 等作为 subrepos。 .hgsub 将如下所示:

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

    通过使用“简单的子存储库路径”,您可以让事情变得简单:克隆看起来就像克隆源一样,并且所有内容都保存在一起。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2011-11-15
      • 1970-01-01
      • 2011-07-08
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多