作为明确的指南aptly points out(搜索“标签和克隆”):
当您运行
hg clone -r foo
以从标记foo
克隆存储库时,新的 clone不包含任何比标记引用的更新的版本, 包括创建标记的修订版。结果就是你 在新的中获得项目历史的正确子集 存储库,但不是您可能期望的标记。
这意味着新克隆中的hg tags
不会显示foo
标记。如果您在添加foo
标记之前克隆了同样的事情,并且您执行了hg pull -r foo
。
(题外话:标签是我唯一没有完全掌握的东西。我明白将它放入变更集中有优势(例如合并),但将元数据与源代码混合总是让人觉得奇怪。)
显而易见的是,我要求采用自动化方式,而不是将标签变更集作为单独的手动步骤。
我知道我可以在incoming
挂钩中检查这个场景(因此它适用于克隆和拉取),或者包裹clone
和pull
。
但是有更好/更简单的方法吗?
UPDATE hg bug tracker已经有this issue。
答案 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-ANYCOMMAND
且pre-ANYCOMMAND
存在),但正如您所指出的那样,您也可以使用*changegroup
或update
个钩子,因为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会添加一个选项来克隆并拉动干净利落。