Desativa comandos específicos do git em um repositório específico?

4

Três vezes recentemente, fiz coisas realmente idiotas ao usar git . Duas vezes executei git reset --hard no meu repositório de diretório pessoal. A primeira vez que gravei uma pesquisa de histórico inverso na minha concha (não significava que fosse executada), e a segunda vez que eu estava na janela de terminal errada (significou redefinir um repo diferente). O outro erro foi executar git push --mirror ssh://remote-machine/ do repositório errado.

git help config me informa que "Para evitar confusões e problemas com o uso de scripts, aliases que ocultam comandos git existentes são ignorados.", então meus aliases .git / config

[alias]
reset = "!echo no"
push = "!echo wrong repo"

são ignorados. Existe uma maneira de fazer isso simplesmente? Provavelmente vou escrever um script de wrapper de algum tipo e alias git=wrapped-git no meu shell, mas eu esperava que houvesse uma maneira mais simples de fazer isso.

Atualizar : usando o seguinte, com base em resposta do grawity , mas aproveitando o sistema de configuração integrado do git. Isso evita o uso de um arquivo ad-hoc e permite "cascatear" (~ / .gitconfig desabilita 'reset' globalmente, mas per-repo .git / config permite isso). No meu .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 "$@"
}
    
por benizi 27.04.2011 / 18:07

1 resposta

4

Não exatamente um script de wrapper - você pode criar uma função de 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
}

Não há uma maneira mais simples do que isso.

Editar: Adicionada -e ao grep: sem isso, o grep interferiu em chamadas como git --version , que se tornaram grep -Fwqs --version , e também com recursos de conclusão de tabulação.

    
por 27.04.2011 / 21:41

Tags