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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用mercurial克隆或拉到标记后如何获取标记变更集?相关的知识,希望对你有一定的参考价值。

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

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

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

(题外话:标签是我唯一不太理解的东西。我理解将它放入变更集中有优势(例如合并),但将元数据与源代码混合在一起感觉很奇怪。)

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

我知道我可以在incoming钩子中检查这个场景(所以它适用于克隆和拉动),或者包装clonepull

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


更新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-ANYCOMMANDpre-ANYCOMMAND存在)虽然你指出你也可以使用*changegroupupdate钩子,因为克隆使用这两个函数(除非你用-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克隆或拉到标记后如何获取标记变更集?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mercurial 克隆中删除工作副本?

如何自动删除 Mercurial 工作树中的所有 .orig 文件?

拖动标记后如何获取纬度和经度?

如何在 Mercurial 中更新现有克隆存储库的 URL

拉动修订未被标记为公共阶段

实现 Cloneable 接口如何允许克隆对象,因为它是一个标记接口并且没有任何方法? [复制]