使用 Mercurial 执行空提交

问题描述 投票:0回答:5

使用 Mercurial 队列扩展,我可以使用一些提交消息进行空提交,如下所示:

hg qnew patch_name -m "message"

有没有一种方法可以在没有 Mercurial 队列的情况下做到这一点?我简单地尝试过:

hg commit -m "message"

但是 hg 只是说“没有任何改变”并且没有进行提交,而且我没有看到任何可以覆盖它的“强制”选项。

如果您想知道我这样做的动机:我们有测试基础设施,您可以将其推送到特殊存储库,它将触发自动测试运行。您需要将一个特殊的字符串放入最顶端提交的提交消息中,以说明要运行哪些测试。显然,当我推送到实际存储库时,我不希望这个字符串在那里。与其修改提交两次(一次添加特殊字符串,第二次删除它),我会发现只添加一个空提交,然后回滚它会更干净——我可以使用 mq 来做到这一点,但我想找到一种无需 mq 的方法。

version-control mercurial commit mercurial-queue
5个回答
19
投票

您可以使用

hg commit --amend
创建空提交。

只需创建任意提交并撤销更改即可。然后将两个提交折叠在一起。

示例:

touch tmp                               # create dummy file
hg add tmp                              # add file and...
hg commit -m "tmp"                      # ... commit
hg rm tmp                               # remove the file again and ...
hg commit --amend -m "empty commit"     # ... commit

8
投票

使用这个命令:

hg ci -m "empty commit" --config ui.allowemptycommit=1

背景:

2015 年mercurial-devel 邮件列表的补丁建议向提交命令添加一个选项,称为

--allow-empty
(很像类似的 git 选项)。然而,决定使用配置选项。

这最终于 2015 年 7 月被添加到 Mercurial 3.5,名称为

ui.allowemptycommit
。不必在用户或存储库的配置文件中指定它,但是,将
--config
开关添加到单个命令就足够了。


此外,在 2020 年,建议

hg rebase
扩展命令考虑另一个实验性配置选项的值。它被命名为
rewrite.empty-successor
,可以设置为
skip
(默认)或
keep
。配置选项本身是在 2020 年 8 月随 Mercurial 5.5 引入的,尽管我不确定
rebase
扩展何时开始考虑它。

它的工作原理似乎是

rebase
读取新选项,然后本地覆盖旧的
ui.allowemptycommit
选项,具体取决于
rewrite.empty-successor
是否配置为
skip
keep
。结果是旧 Mercurial 版本的
rebase
扩展直接观察到
ui.allowemptycommit=1
选项(测试过的版本 4.8.2),而较新版本的扩展则观察到
rewrite.empty-successor=keep
(测试过的版本 6.1)。较新的版本忽略
ui.allowemptycommit
配置的外部状态。

因此,为了让

hg rebase
能够以某种方式保留空变更集,可以设置这两个选项以保留它们,如本例所示:

hg rebase --config rewrite.empty-successor=keep --config ui.allowemptycommit=1 ...

我对这一切的用例是在

hg convert
存储库上使用
svn
,然后使用空的
hg commit
成为初始提交(本地变更集编号 0)。然后我将首先使用
hg rebase
使即将到来的变更集 0 成为第一个导入的 svn 修订版的父级(因此它将成为本地变更集编号 1,与 svn 修订版号匹配),然后修复某个问题提交
hg convert
无法正确解析。对我来说至关重要的是
hg rebase
命令应保留空提交,例如基于仅更改目录的
svn
修订版的提交。 (Mercurial 永远不会单独跟踪目录,只会跟踪文件。)


5
投票

您可以进行关闭分支的提交:

hg commit --close-branch -m "message"

更新:

您可以关闭分支一次,但可以通过另一次提交重新打开它。在不更改文件的情况下重新打开分支的最简单方法是标记某些修订。因此,您可以使用

hg commit --close-branch
进行空提交,然后使用
hg tag
重新打开。

更新v2

实际上,您只需使用

hg tag
命令即可创建新的空提交。它有
-m
参数用于设置提交消息。如果您并不真正关心此标签的正确性,您可以通过使用
hg tag
参数调用
-f
来仅使用一个标签名称:

hg tag t1 -f -m "message"

4
投票

您现在只需执行

hg ci -m "empty commit"

即可创建空提交

例如

hg branch my-next-branch
hg ci -m "empty commit"

将创建一个带有单个空提交的

my-next-branch
,您可以将其推送到远程存储库。


1
投票

我刚刚发现

hg graft . --force --edit
可以很好地实现此目的。

这将强制移植当前签出的提交,因此它将为空,并且它将打开一个编辑器以输入提交消息。

© www.soinside.com 2019 - 2024. All rights reserved.