最近有三次,我在使用时做了非常愚蠢的事情git
。两次我都git reset --hard
在主目录存储库上运行。第一次我在 shell 中错误地执行了反向历史搜索(根本不想运行它),第二次我在错误的终端窗口中(本来想重置不同的存储库)。另一个错误是git push --mirror ssh://remote-machine/
从错误的存储库运行。
git help config
通知我“为了避免脚本使用的混淆和麻烦,隐藏现有 git 命令的别名将被忽略。”,所以我的 .git/config 别名
[alias]
reset = "!echo no"
push = "!echo wrong repo"
被忽略。有没有简单的方法可以做到这一点?我可能会在我的 shell 中编写某种包装器脚本alias git=wrapped-git
,但我希望有一种更简单的方法来做到这一点。
更新:使用以下内容,基于gravity 的回答,但利用了 git 的内置配置系统。这样可以避免 grep 临时文件,并允许“级联”(~/.gitconfig 全局禁用“重置”,但每个存储库的 .git/config 都启用它)。在我的 .zshrc 中:
git () {
local disabled=$(command git config --bool disabled.$1 2>/dev/null)
if ${disabled:-false} ; then
echo "The $1 command is intentionally disabled" >&2
return 1
fi
command git "$@"
}
答案1
不是确切地包装器脚本 – 您可以创建一个 shell 函数:
git() {
local gitdir=$(git rev-parse --git-dir 2>/dev/null)
if [[ $gitdir && -f $gitdir/disabled-commands ]]; then
# "disabled-commands" should contain "push", "reset", etc
if grep -Fwqse "$1" "$gitdir/disabled-commands"; then
echo "You have disabled this command." >&2
return 1
else
command git "$@"
fi
else
command git "$@"
fi
}
没有比这更简单的方法了。
编辑:添加-e
到 grep:如果没有它,grep 会干扰诸如 之类的调用git --version
,后者变成grep -Fwqs --version
,还会干扰制表符补全功能。