在特定的存储库中禁用特定的 git 命令?

在特定的存储库中禁用特定的 git 命令?

最近有三次,我在使用时做了非常愚蠢的事情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,还会干扰制表符补全功能。

相关内容