有没有办法为 git 个选项创建快捷方式或别名
Is there a way to create a shortcut or alias for git option(s)
我发现自己在 git log
、git diff
、git 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.
我已经有了 log
、diff
、difftool
的别名。不可能有 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>
我发现自己在 git log
、git diff
、git 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.
我已经有了 log
、diff
、difftool
的别名。不可能有 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>