包含绝对路径的Mercurial [subpaths]在推送时附加到主repo的默认路径

时间:2012-01-27 12:40:35

标签: mercurial mercurial-subrepos

在Windows上运行Mercurial 2.0.2:

在我的.hgrc:

[subpaths]
MYREPOS/(.*) = https://server/repos/\1

在我的.hgsub中:

subrepo/lib = MYREPOS/lib

当我进行推送时,子仓库的推送路径是它与主仓库的路径的连接,而不是绝对路径 - 输出是:

pushing to https://server/repos/main 
pushing subrepo subrepo\lib to https://server/repos/main/http%3A//server/repos/lib

我原以为:

pushing to https://server/repos/main
pushing subrepo subrepo\lib to https://server/repos/lib

是因为子仓库路径的'绝对性或相对性'是由.hgsub中的右手路径决定的,而不是它映射到的值?例如,MYREPOS / lib是相对的,因此映射的路径将被视为相对路径,无论它是否相同?

1 个答案:

答案 0 :(得分:3)

子库存逻辑已更改between 1.9 and 2.0。现在的程序是:

  1. 如果.hgsub中的路径是相对的,则将其与主存储库路径
  2. 连接
  3. 将重新映射规则应用于此最终路径
  4. 在此更改之前,我们会:

    1. 将重新映射规则应用于.hgsub
    2. 的路径
    3. 如果重映射的路径是相对路径,则将其与主存储库路径
    4. 连接

      所以你是对的,MYREPOS/lib在第一步被视为相对路径。因此,子存储库的完整路径是

      https://server/repos/main/MYREPOS/lib
      

      并且您的重新映射模式仍会触发。这解释了为什么您在推送网址中间看到http://...的原因。但是,有一个后备将恢复旧行为。如果您的模式是

      ^MYREPOS/(.*) = https://server/repos/\1
      

      然后它不会匹配新步骤2中的任何内容 - 它只会在路径的开头重新映射MYREPOS。我们注意到这一点并使用旧算法!