如何更改 hg 日志的默认行为以仅显示祖先?

How to change default behaviour of hg log to only show ancestors?

是否可以更改 hg log 的默认行为以仅显示当前祖先?

即:

hg log --rev "reverse(ancestors(.))"

事实是,我总是希望hg log这样做。

我知道我可以在我的 .bashrc 中做这样的事情,但我想知道是否有一种灵活的方法来做到这一点。

hg () {

    if [[  -eq "log" ]]
    then
        # TODO: Append other arguments to this...
        hg log --rev "reverse(ancestors(.))" 
    else
        # Run the command
    fi
}

虽然您可以使用别名来完成此操作(见下文),但这里最简洁的方法是扩展:

from mercurial import extensions, commands

testedwith = "3.5"

default_log_rev = "reverse(ancestors(.))"

def override_log(original_cmd, ui, repo, *pats, **opts):
  have_rev = False
  for opt in ["rev", "branch"]:
    if opts.has_key(opt) and opts[opt]:
      have_rev = True
  if not have_rev:
    opts["rev"] = [default_log_rev]
  return original_cmd(ui, repo, *pats, **opts)

def uisetup(ui):
  extensions.wrapcommand(commands.table, "log", override_log)

如果 log--rev--branch 选项(或其缩写 -r-b)都没有,这将仅使用您的新默认值已设置,因此如果提供其中之一,则保留原始行为。

您可以用通常的方式安装这样的扩展,即在您的 ~/.hgrc 中添加如下内容(假设上面的代码在 /path/to/logdefault.py 中):

[extensions]
logdefault = /path/to/logdefault.py

如果扩展名对您来说是重量级的,您还可以在 ~/.hgrc:

中创建一个别名
[alias]
log = log --rev 'reverse(ancestors(.))'
rawlog = !$HG --config alias.log=log log "$@"

存在第二个别名 (rawlog),这样您仍然可以访问原来的 log 功能。

hg 的别名功能是正确的工具。虽然您可以创建别名来修改内置命令的默认行为,但 hg config(第 "alias" 节)有以下内容:

Note:
   It is possible to create aliases with the same names as existing
   commands, which will then override the original definitions. This is
   almost always a bad idea!

推荐的做法是创建一个别名 alog 并简单地训练您的手指键入 hg alog 而不是 hg log。将它放在 ~/.hgrc(或等价物)中即可:

[alias]
alog = log --rev "reverse(ancestors(.))"

为什么这是更好的解决方案? log 的别名不仅会阻止您访问原始行为(需要 另一个 别名来恢复原始含义);更重要的是,一旦您开始期待非标准行为,当您在不受您的 .hgrc 控制的另一个帐户或上下文中键入 hg log 时,您迟早会受到影响。 (在相同情况下输入 hg alog 只会产生 "unknown command" 错误)。