使用mercurial克隆或拉到标记后如何获取标记变更集?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用mercurial克隆或拉到标记后如何获取标记变更集?相关的知识,希望对你有一定的参考价值。
作为明确指南aptly points out(搜索“标签和克隆”):
当您运行
hg clone -r foo
以从标记foo
克隆存储库时,新克隆将不包含比标记引用的更新的任何修订版本,包括创建标记的修订版本。结果是,您将在新存储库中获得项目历史记录的正确子集,但不会获得您可能预期的标记。
这意味着你的新克隆中的hg tags
不显示foo
标签。如果您在添加foo
标签之前克隆了,并且您执行了hg pull -r foo
,则会发生同样的事情。
(题外话:标签是我唯一不太理解的东西。我理解将它放入变更集中有优势(例如合并),但将元数据与源代码混合在一起感觉很奇怪。)
很明显,我要求采用自动化方式,而不是将标签变更集作为单独的手动步骤。
我知道我可以在incoming
钩子中检查这个场景(所以它适用于克隆和拉动),或者包装clone
和pull
。
但是有更好/更简单的方法吗?
更新hg bug跟踪器已经有this issue。
你想要一个与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
交换机不仅适用于本地回购。
我想的越多,我就越相信正确的答案就是克隆所有东西并更新到标签,这可以在一个步骤中完成:
hg clone http://host/path#tagname
这样可以获得所有内容,然后将hg update
作为标记名,将您的工作目录设置为正确的修订版。鉴于增量压缩不一定要大得多,如果是,您可以自动从先前的本地克隆中克隆大部分压缩。
有一个postclone钩子。它被称为post-clone
(hgrc手册页显示post-ANYCOMMAND
和pre-ANYCOMMAND
存在)虽然你指出你也可以使用*changegroup
或update
钩子,因为克隆使用这两个函数(除非你用-U
抑制更新)。
如果只需要参考,只需添加一个--localtag
就可以获得名称而不是额外的变更集。就像是
hg clone -r tagname URL
hg tag --local tagname
你可以轻松地构建一个shell别名。
除此之外,没有必要保证有一种方法来修改版本X和版本X标记的修订版本,而不需要其他修订版本,因为标记可能在其他工作完成后应用。当然,您可以随时更新为“X”并在您的工作目录中使用后续更改集,但它们仍将在您的仓库中。
老实说,一旦我弄清楚标签名称在你克隆到标签时没有那么长时间,我承认起初我很困惑,我发现没有必要随身携带变更集。标签在里面。
是的,它可以通过后克隆/拉钩来完成,但有几个骗子。
首先,它只适用于本地存储,因为您无法获取远程仓库中的标记列表。
其次,处理克隆/拉取参数和选项并非易事。 (对于克隆我需要获得目标回购,-r
,-u
,-U
。对于拉我需要-r
和-u
。)我尝试使用fancyopts,但它无法处理全局选项,这些选项在调度中被处理掉。我设法破解派遣只给我一个命令的args和opts,但它感觉和看起来很难看。
使用命令包装器将消除第二个问题。
我希望有一天hg会添加一个选项来克隆并拉动干净利落。
以上是关于使用mercurial克隆或拉到标记后如何获取标记变更集?的主要内容,如果未能解决你的问题,请参考以下文章