使用 Mercurial 队列扩展,我可以使用一些提交消息进行空提交,如下所示:
hg qnew patch_name -m "message"
有没有一种方法可以在没有 Mercurial 队列的情况下做到这一点?我简单地尝试过:
hg commit -m "message"
但是 hg 只是说“没有任何改变”并且没有进行提交,而且我没有看到任何可以覆盖它的“强制”选项。
如果您想知道我这样做的动机:我们有测试基础设施,您可以将其推送到特殊存储库,它将触发自动测试运行。您需要将一个特殊的字符串放入最顶端提交的提交消息中,以说明要运行哪些测试。显然,当我推送到实际存储库时,我不希望这个字符串在那里。与其修改提交两次(一次添加特殊字符串,第二次删除它),我会发现只添加一个空提交,然后回滚它会更干净——我可以使用 mq 来做到这一点,但我想找到一种无需 mq 的方法。
您可以使用
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
使用这个命令:
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 永远不会单独跟踪目录,只会跟踪文件。)
您可以进行关闭分支的提交:
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"
您现在只需执行
hg ci -m "empty commit"
即可创建空提交
例如
hg branch my-next-branch
hg ci -m "empty commit"
将创建一个带有单个空提交的
my-next-branch
,您可以将其推送到远程存储库。
我刚刚发现
hg graft . --force --edit
可以很好地实现此目的。
这将强制移植当前签出的提交,因此它将为空,并且它将打开一个编辑器以输入提交消息。