使用mercurial克隆或拉到标记后如何获取标记变更集?

时间:2010-09-22 15:27:33

标签: mercurial clone

作为明确的指南aptly points out(搜索“标签和克隆”):

  

当您运行hg clone -r foo以从标记foo克隆存储库时,新的   clone不包含任何比标记引用的更新的版本,   包括创建标记的修订版。结果就是你   在新的中获得项目历史的正确子集   存储库,但不是您可能期望的标记

这意味着新克隆中的hg tags不会显示foo标记。如果您在添加foo标记之前克隆了同样的事情,并且您执行了hg pull -r foo

(题外话:标签是我唯一没有完全掌握的东西。我明白将它放入变更集中有优势(例如合并),但将元数据与源代码混合总是让人觉得奇怪。)

显而易见的是,我要求采用自动化方式,而不是将标签变更集作为单独的手动步骤。

我知道我可以在incoming挂钩中检查这个场景(因此它适用于克隆和拉取),或者包裹clonepull

但是有更好/更简单的方法吗?


UPDATE hg bug tracker已经有this issue

4 个答案:

答案 0 :(得分:3)

你想要一个拥有bash和嵌入式Perl脚本的巨型黑客?好吧,这是...

#!/bin/bash
if [[ "$1" == "" || "$2" == "" || "$3" == "" ]]; then
  echo 'hgclonetag <src> <tgt> <tag>'
  exit 1;
fi

REV=`hg log -R $1 --rev $3: --limit=2 | perl -F: -lane 'if (/:([\dA-Fa-f]+)$/) {print $F[2] if defined($flag);$flag=1;}'`
hg clone --rev $REV $1 $2

这将调用hg log命令在第一个与标签相关的修订版之后提取修订版号,然后克隆到此修订版。

目前这不适用于远程存储库:-R交换机仅适用于本地存储库。

答案 1 :(得分:3)

我想的越多,我就越相信正确的答案就是克隆所有内容并更新到标签,这可以在一个步骤中完成:

hg clone http://host/path#tagname

它可以为您提供所有内容,然后hg update为标记名,将您的工作目录设置为正确的修订版。鉴于增量压缩不一定要大得多,如果是,你可以自动从以前的本地克隆中克隆大部分压缩。

答案 2 :(得分:1)

有一个postclone钩子。它被称为post-clone(hgrc联机帮助页显示post-ANYCOMMANDpre-ANYCOMMAND存在),但正如您所指出的那样,您也可以使用*changegroupupdate个钩子,因为clone使用这两个函数(除非您使用-U禁止更新)。

如果仅需要参考,只需添加--localtag即可获得名称,但不能使用额外的变更集。像

这样的东西
hg clone -r tagname URL
hg tag --local tagname

您可以轻松地将其构建为shell别名。

除此之外,没有必要保证有一种方法可以使用修订版X和修订版本,其中标记修订版X而不需要其他修订版本,因为标记可能在其他工作完成后应用。当然,您可以随时更新为“X”并在您的工作目录中使用后续更改集,但它们仍然会在您的仓库中。

老实说,一旦我弄清楚当你克隆到标签时标签名称不会很长,我承认起初我很困惑,我发现没有必要携带变换集中包含标记。

答案 3 :(得分:0)

是的,可以通过后克隆/拉钩来完成,但有几个骗子。

首先,它只适用于本地仓库,因为您无法获取远程仓库中的标签列表。

其次,处理克隆/拉取参数和选项并非易事。 (对于克隆,我需要获取目标仓库,-r-u-U。对于拉,我需要-r-u。)我试图使用fancyopts,但它无法处理全局选项,这些选项在发送时被处理掉。我设法破解派遣只给了我一个命令的args和opts,但它感觉并且看起来很难看。

使用命令包装器可以消除第二个问题。

我希望有一天hg会添加一个选项来克隆并拉动干净利落。