我正在使用 zsh 插件中的 git 别名:https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git
所以它有 git 别名,例如:
gst # git status
ga # git add
gc "commit" # git commit -v "commit"
...
...而且我还使用 git bare repo 来备份我的所有点文件:https://github.com/Anthonyive/dotfiles/blob/0706bc81daa3aeb7899b506cd89d4ab78fc7b176/USAGE.md
特别是, git bare repo 技术将 git 命令别名为dotfiles
:
alias dotfiles='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
alias d='dotfiles'
那么如何将所有 git alias 命令映射到d
?喜欢:
dst # similar to gst, but uses the dotfiles alias
da # similar to ga
dc "commit" # similar to gc "commit"
...
一张一张地映射它们似乎很乏味......
答案1
关联数组aliases
包含所有别名定义。
for name in "${(@k)aliases}"; do
if [[ $name == g* && $aliases[$name] == 'git '* ]]; then
alias d${name#g}="dotfiles ${aliases[$name]#git }"
fi
done
或者,您可以将d
别名更改为需要以下 git 命令的函数,但首先扩展 shell 别名并删除任何前导git
.
alias d='d ' # expand aliases after d
function d {
if [[ $1 == "git" ]]; then shift; fi
dotfiles "$@"
}
然后d gst
将运行dotfiles status
、d gc myfile
将运行dotfiles commit myfile
、d ls-tree
将运行dotfiles ls-tree
等等。完成是可行的,但并不容易。
答案2
要将所有调用替换git
为git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME
,您可以使用一个函数:
git() {
command git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME "$@"
}
然而,对于这种情况,您实际上不必这样做。git
您可以通过环境变量指定它们,而不是将这些选项标志传递给:
export GIT_DIR=$HOME/.dotfiles/
export GIT_WORK_TREE=$HOME
看https://www.git-scm.com/docs/git#Documentation/git.txt---git-dirltpathgt
顺便说一句,您可以只使用,而不是维护和尝试记住大量别名zsh-autocomplete
的历史补全模式。 (免责声明:我是这个插件的维护者。)