有没有办法为 git 个选项创建快捷方式或别名

Is there a way to create a shortcut or alias for git option(s)

我发现自己在 git loggit diffgit show 中经常使用 --name-status 选项。我知道 git 别名,但它们仅适用于命令或命令组合 and/or 选项。我不想为这个选项创建git别名。

# l is an alias for log with pretty format
git l --name-status

所以我可以做这样的事情,其中​​ --ns--name-status 的快捷方式:

git l --ns

更新:不同的注意事项见

我认为别名命令行参数是不可能的。

除非修改源代码以识别其他标志,最好的办法可能是使用别名重写标志:

[alias]
    l = "!l() { : git log ; git log $(echo \"$@\" | sed \"s/--ns/--name-status/\") ; } && l"

或者您可以在 bash 中定义一些别名 g 来为您完成此操作(您可以配置 auto-complete 来使用它,但我不记得该怎么做那是我的头顶):

function g {
    git $(echo "$@" | sed "s/--ns/--name-status/")
}

我希望这个 hack 对某人有所帮助,所以将它张贴在这里。它基于 这个问题。

我本可以创建自己的 git 命令 ~/bin/git-<custom command>,但我更愿意在备份 .gitconfig 时更改现有的 git 别名。 git 命令的优点是在提到 <path> 时在当前目录中执行(不需要下面提到的 cd ${GIT_PREFIX:-.})。

我将替换选项逻辑提取到助手 fn options 中。然后用于别名 l (log)、d (diff)、dt (difftool) 等。我故意保留了它fn 在 gitconfig 而不是 shell 脚本中,所以一切都在一个地方。向该 fn 添加新选项也很容易。

cd ${GIT_PREFIX:-.} 需要为执行 shell 命令 (see this) 的 git 别名兑现 <path>。这对 git log.

很重要

Note that shell commands will be executed from the top-level directory of a repository, which may not necessarily be the current directory.

我已经有了 logdiffdifftool 的别名。不可能有 git 别名或自定义 git 命令来覆盖 built-in git 命令并且不想为 show 创建一个所以我遗漏了 git show.

之前:

[alias]
    l       = !"cd ${GIT_PREFIX:-.} && git lg2"
    d       = diff
    dt      = difftool
    lg2     = # alias for log

之后:

[alias]
    l       = "!f() { cd ${GIT_PREFIX:-.} && git lg2 $(git options "$@"); }; f"
    d       = "!f() { cd ${GIT_PREFIX:-.} && git diff $(git options "$@"); }; f"
    dt      = "!f() { cd ${GIT_PREFIX:-.} && git difftool $(git options "$@"); }; f"
    lg2     = # alias for log
    #workaround: helper fn to alias options
    options = "!f() { \
                echo "$@" \
                    | sed 's/\s/\n/g' \
                    | sed 's/^--ns$/--name-status/' \
                    | sed 's/^--no$/--name-only/' \
                    | xargs; \
            }; f"

所以现在我可以做:

git l --ns
git d head~ --ns
git dt head~ --ns

# with paths:
git l --ns -- <path>
git d head~ --ns -- <path>
git dt head~ --ns -- <path>