1

我发现自己经常使用--name-statusoption 和git log, git diff, git show。我知道 git 别名,但它们仅适用于命令或命令和/或选项的组合。我不想只为这个选项创建 git 别名。

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

--ns所以我可以在快捷方式的地方做这样的事情--name-status

git l --ns

更新:请参阅我自己的答案以了解不同的考虑。

4

3 回答 3

1

除非修改源代码以识别其他标志,否则您最好的选择可能是使用别名来重写标志:

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

或者,您可以在 bash 中定义一些别名g来为您执行此操作(您可以配置自动完成以使用此功能,但我不记得如何做到这一点):

function g {
    git $(echo "$@" | sed "s/--ns/--name-status/")
}
于 2017-02-02T20:25:30.283 回答
1

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

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

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

cd ${GIT_PREFIX:-.}需要尊重<path>作为 shell 命令执行的 git 别名(请参阅此)。这对于git log.

请注意,shell 命令将从存储库的顶级目录执行,该目录可能不一定是当前目录。

我已经有了log, diff,的别名difftool。不可能有一个 git 别名或自定义 git 命令来覆盖内置的 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>
于 2017-02-05T19:56:49.630 回答
0

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

于 2017-02-02T20:21:06.227 回答