【问题标题】:Mercurial: explicitly specifying branch/tag/bookmark when cloningMercurial:克隆时明确指定分支/标签/书签
【发布时间】:2015-04-28 13:35:09
【问题描述】:

在一个 mercurial repo 中,您可以拥有一个名称相同的分支、标签和书签。 hg help revsets 告诉您如何明确指定它。我可以使用它,例如

hg update 'branch(foo)'

但没有

hg clone --updaterev 'branch(foo)' somerepo

这给出了错误abort: unknown revision 'branch(foo)'!,即使

hg clone --updaterev 'foo' somerepo

只要没有名称冲突,就可以正常工作(给我分支)。我对标签也观察到了同样的情况。 克隆时有没有办法直接明确指定分支/标签/书签?

【问题讨论】:

  • 虽然相关,但它们是两个不同的问题。我决定专门单独询问他们,以避免得到仅针对一部分的答案,这很容易忽略仍然存在未解决的问题。我试图详细说明以使问题更具体。

标签: mercurial


【解决方案1】:

你需要:

  • 了解 Mercurial 中 revset 和单个修订之间的区别
  • 了解 --updaterev 在幕后使用 revsets 语言 (hg help revsets),分支 (ID) 将返回带有 所有变更集 的修订集,但 --updaterev 需要 单个变更集

我懒得同时测试 --updaterev 的所有 3 个对象的 repo,但是(对于分支案例)--updaterev 'foo' 在操作之前在内部定义了 foo 的头

有没有办法直接明确指定分支/标签/书签 什么时候克隆?

是的。只需在 revset-definition 中使用正确的谓词,它会在每次变更集时唯一标识您需要的谓词

  • 分支:branch(foo) and head(),或者在多头分支的情况下,类似last(heads(branch(foo)))
  • 书签:bookmark(foo)
  • 标签:tag(foo)

【讨论】:

  • 感谢您的洞察力,它确实有道理。但是,我仍然无法让 revsets 语言与克隆一起使用,例如:hg clone --updaterev "rev(1)" somerepo 给出了相同的错误 (abort: unknown revision 'rev(1)'!)。 hg clone --updaterev "1" somerepo 工作正常。我使用的是 hg 3.1 版。
  • @TrygveFlathen - 为什么不只是 hg clone --rev 1,哪个有效?
  • --rev--updaterev 不同:updaterev 将克隆整个 repo,然后检查给定的修订,而 rev 只会克隆给定的修订和相关历史记录。 (我这里只是用rev()作为一个简单的例子来说明使用带有--updaterev的revset语言的问题。)
  • 是的,但是“1”和“rev(1)”只是作为一个简单的例子来说明我没有让revsets语言与--updaterev一起工作。我想克隆并签出特定的分支/标签/书签,即使可能存在名称冲突。您的初始答案将是完美的,除非我无法使该语法与 --updaterev 一起使用。
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 2011-05-18
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多