我希望这个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>