如何在 mercurial 中克隆主题?

How to clone topics in mercurial?

背景:Mercurial 主题

例如,Mercurial 有一个很好的功能调用 topics as part of the evolve extension. These act as temporary lightweight local branches, and are an integral part of the Heptapod workflow, ensuring nice interactions with Git (via hg-git)。它们通过在您的 ~/.hgrc 文件(或 .hg/hgrc 中的每个 repo)中包含以下内容来启用:

# ~/.hgrc
...

[extensions]
evolve =
topics =

由于这些是为本地工作而设计的,因此当您推送时,主题不会推送到服务器(而是成为 git 中带有 Heptapod workflow 的临时分支)。

问题

如何在本地克隆 repo 以获取我克隆的主题?

部分答案是将源代码库设置为非发布:(克隆后可能应该在克隆的代码库中执行此操作)。

# source_repo/.hg/hgrc

[phases]
publish = false

这保留了作为主题一部分的变更集的 draft 阶段。

更新: 对于 python==3.9.7mercurial==6.0.1hg-evolve==10.4.1 或更高版本,这似乎就足够了。正如@Craig 在评论中指出的那样,最初的问题可能是因为我将第一个提交作为一个主题,但这不再是一个问题。

MWE(旧...这似乎现在有效。)

mkdir a
cd a
touch A.txt
hg init
hg add A.txt
hg topic "A"
hg commit -m "Initial commit of A"
cat > .hg/hgrc <<EOF
[phases]
publish = false
EOF
cd ..
hg clone a b

现在 a 中有一个主题 A 并且提交处于草稿阶段(在输出中以橙色显示):

$ hg log -v
changeset:   0:62c4...    # orange, indicating draft phase
tag:         tip
topic:       A
user:        Michael <...>
date:        Wed ...
files:       A.txt
description:
Initial commit of A

而在b中,一切都一样,包括draft阶段,但没有主题:

$ hg log -v
changeset:   0:62c4...    # orange, indicating draft phase
tag:         tip
user:        Michael <...>
date:        Wed ...
files:       A.txt
description:
Initial commit of A

这似乎是一个本地化的错误。制作源代码库发布似乎就足够了。

# source_repo/.hg/hgrc

[phases]
publish = false

也许可以考虑这是一种解决方法,但它应该有效。

如果您只是在本地工作,实际上不必 clone。您可以制作整个工作文件夹(包含 .hg 文件夹的文件夹)的完整副本。

将它复制到任何你想要的地方,然后当你在该路径中 运行 Mercurial 命令时,它的行为将与克隆时完全一样,除了它不会看到你的original 作为默认发布回购协议,但与您的原始回购协议相同。如果需要,您显然可以在 .hgrc 文件中更改它。

根据您的需要,您可能需要预先执行 hg up null 以清除所有本地工作文件,这将加快大型存储库的复制速度。