使用mercurial执行空提交

HC4*_*ica 15 version-control mercurial commit mercurial-queue

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

hg qnew patch_name -m "message"
Run Code Online (Sandbox Code Playgroud)

没有Mercurial队列有没有办法做到这一点?我试过简单地说:

hg commit -m "message"
Run Code Online (Sandbox Code Playgroud)

但是hg只是说"没有改变"并且没有做提交,我没有看到任何"强制"选项会覆盖它.

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

Jos*_*isl 16

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • @matteo为什么不呢?只要你没有在两个`hg commit`命令之间插入就可以了. (5认同)
  • 改进@JosefEisl别名`[别名] emptycommit =!touch tmp; $ HG添加tmp; $ HG commit tmp -m"<enter commit message>"; $ HG rm tmp; $ HG commit tmp --amend"$ @"`提交应该以我们的tmp文件为目标,这样我们就不会提交更改(所以它总是空提交). (3认同)
  • @richard同意了!但是你可以通过将以下内容放入.hgrc文件中来更频繁地创建一个别名:`[alias] emptycommit =!touch tmp; $ HG添加tmp; $ HG commit -m"<enter commit message>"; $ HG rm tmp; $ HG commit --amend"$ @"` (2认同)

ecm*_*ecm 8

2015 年,mercurial-devel 邮件列表的一个补丁建议在 commit 命令中添加一个选项,称为--allow-empty(很像类似的 git option)。然而,我们决定采用配置选项。

它最终于 2015 年 7 月添加到 Mercurial 3.5 中,名称为ui.allowemptycommit。不必在用户或存储库的配置文件中指定它,但是,--config向单个命令添加一个开关就足够了,如下所示:

hg ci -m "empty commit" --config ui.allowemptycommit=1
Run Code Online (Sandbox Code Playgroud)

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

它的工作原理似乎是rebase 读取新选项,然后根据是否配置为或来本地覆盖旧选项。结果是,较旧的 Mercurial 版本的扩展直接观察该选项(测试的版本 4.8.2),而较新版本的扩展则观察该选项(测试的版本 6.1)。较新的版本忽略配置的外部状态。ui.allowemptycommitrewrite.empty-successorskipkeeprebaseui.allowemptycommit=1rewrite.empty-successor=keepui.allowemptycommit

因此,为了以hg rebase某种方式可移植地保留空变更集,可以设置这两个选项以保留它们,如下例所示:

hg rebase --config rewrite.empty-successor=keep --config ui.allowemptycommit=1 ...
Run Code Online (Sandbox Code Playgroud)

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


rpe*_*kov 5

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

hg commit --close-branch -m "message"
Run Code Online (Sandbox Code Playgroud)

更新:

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

更新v2

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

hg tag t1 -f -m "message"
Run Code Online (Sandbox Code Playgroud)

  • 关闭分支或添加标签不是真正的“空”提交。 (3认同)
  • 嘿,实际上您可以创建新标签而无需关闭分支。如果您不关心标签而只关心提交消息,您甚至可以只使用一个标签并使用“-f”标志设置它。因此,您可以使用 `hg tag t1 -f -m "message"` 创建空提交。 (2认同)

gre*_*ell 5

您现在可以通过执行以下操作来创建空提交hg ci -m "empty commit"

例如

hg branch my-next-branch
hg ci -m "empty commit"
Run Code Online (Sandbox Code Playgroud)

将创建一个my-next-branch带有单个空提交的文件,您可以将其推送到远程存储库。

  • 我总是能够有一个“空”提交,它除了创建一个分支之外什么也不做。假设我已向分支进行了七次提交,然后只想添加新的提交消息而不更改文件。在这种情况下 `hg ci -m "empty commit"` 应该起作用吗?我尝试了一下,但没有成功。我不知道我是否只有旧版本,或者是否因为该示例首先创建了一个分支,而我在描述的场景中没有这样做。 (2认同)