2010-09-22 38 views
6

由于确定指导aptly points out(搜索“标签和克隆”):如何在使用mercurial克隆或拉出标签后获取标签更改集?

当您运行hg clone -r foo克隆库作为标签foo,新 克隆将不包含任何版本比一个较新的标签指的是 ,包括创建标签的版本。其结果是,您将在 存储库中获得项目历史记录的正确子集 ,但不是您可能预期的标记

这意味着hg tags在您的新克隆中不显示foo标记。如果在添加foo标记之前进行了克隆,并且您做了hg pull -r foo,则会发生同样的情况。我知道把它放入变更集中有很多优点(比如合并),但是它总让人觉得奇怪的是元数据与源代码混合在一起代码)。

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

我知道我可以在incoming钩检查这个场景(所以它同时适用于克隆和拉),或包裹clonepull

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


更新hg bug跟踪器已经有this issue

+2

标签介绍changesets已成为我真正不喜欢Mercurial的几件事之一 – 2010-09-22 17:08:41

回答

0

是的,它可以通过后克隆/拉钩完成,但有一些骗子。

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

其次,处理克隆/拉参数和选项不是微不足道的。 (对于克隆我需要获得目标回购,-r,-u,-U。对于拉我需要-r-u。)我试图使用fancyopts,但它不能处理全局选项,这是在派遣处理。我设法破解派遣,只给了我一个命令的参数和选择,但感觉和看起来很难看。

使用命令包装将消除第二个问题。

我希望有一天hg会添加一个选项来克隆并拉动干净地完成它。

+1

如果你使用的是钩子,你不能检查'$ HG_URL'变量的值。 – 2011-01-25 22:58:44

+0

我也需要pats和opts,但是你提到的$ HG_URL帮助我从[man hgrc](http://www.selenic.com/mercurial/hgrc.5.html#hooks)发现所有的pre/post钩子获得$ HG_PATS和$ HG_OPTS。 – 2011-01-26 05:07:37

1

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

如果只需要添加--localtag,那么您只需要名称,而不需要额外的变更集,只需要参考即可。像

hg clone -r tagname URL 
hg tag --local tagname 

你可以很容易地建立一个shell别名。

除此之外,不一定有保证是修订版本X和修订版本X被标记的修订版本,而不需要修改其他修订版本,因为标记可能在其他工作完成后应用。当然,您可以随时更新为'X',并在您的工作目录中拥有随后的变更集,但他们仍然会在您的回购站中。

说实话,一旦我发现标签名称在标签克隆时并没有很长的时间,我承认最初让我感到困惑,我没有发现任何需要携带带有标签的变更集。

+0

感谢您的克隆后钩。我删除了“,因为这个问题没有'postclone'钩子。我不太喜欢本地标签,因为我肯定会在一段时间后拉入标签变更集。也没有标签变更集,我可以自己提交一个标签,然后我必须合并标签。 – 2010-09-22 15:56:11

+0

是的,这不是完美的,但没有办法做到这一点,无需拉动您可能还不想要的额外变更集(工作和标记集之间的所有变更集)。至少标签无缝合并,本地不能冲突或被推送。 – 2010-09-22 16:27:23

+0

如果它是标记的唯一孩子,我只会拉动标记更改集。 @ Richard的回答给了我一个想法,即使用预克隆和预拉钩来检查案例并将克隆/拉出版本更改为标签变更集。将回传。 – 2010-09-22 19:02:56

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交换机不幸只能在本地回购。

+3

如果你没有明确包含像“巨人”,“黑客”(哎呀,我刚刚冒犯了莱纳斯勋爵?*远程雷霆收集... *),“bash”和“perl” 的。我希望有一个小巧,优雅,基于hg的python解决方案:)不过。 – 2010-09-22 16:41:13

+1

使用'os.system'和一些正则表达式匹配来简化Pythonize应该很简单。好评:+1你自己! – 2010-09-22 16:50:24

+2

这不会工作,当你标记一个旧版本...如果我做'hg标签-r 100 foo',那么我可能会创建修订版本1000.所以提取版本101不会带入标签。 – 2010-09-30 15:48:34

3

我越去想它更多的我相信了答案是只克隆一切,更新代码,它可以在一个单一的步骤来完成:

hg clone http://host/path#tagname 

这会激发你的一切,然后hg update标记名将你的工作目录设置为正确的修订版本。给定的增量压缩不一定要大得多,如果是的话,您可以自动克隆其以前的本地克隆的大部分。

+0

谢谢,我不知道我也可以使用#。然而问题是,正如我的问题所述,在克隆中没有标记变更集,所以我不知道克隆是哪个标记。 – 2011-01-26 04:53:38

+0

咦?看起来你知道这个名字,那个名字是'foo'。所以你可以做'hg clone http:// host/path#foo'。如果你真的不知道标签的名字,你应该克隆一切,然后更新 - 在你的回购中有额外的转换没有坏处,但不是你的工作目录。 – 2011-01-26 15:07:46

+0

对不起,我的意思是“**克隆所在的标签**”,因为克隆没有'foo'标签变更集。当然,我知道在克隆之后,但是不会过一会儿(我有可怕的短期记忆)。正如你所说,做一个完整的克隆然后更新是一个明显的解决方案,而且我总是这样做。只是'克隆父#foo'语义感觉有点奇怪,没有得到标签变更集。 – 2011-01-27 15:18:05