Configurando sinalizadores padrão do git em comandos

88

Quero saber se existe uma maneira de definir um sinalizador por padrão para o comando git. Especificamente, desejo definir o --abbrev-commitsinalizador para que, durante a execução git log, eu queira executar git log --abbrev-commit.

Ao contrário da pergunta " há alguma maneira de definir um sinalizador por padrão para um comando git? ", Aparentemente não há um sinalizador de configuração para adicionar --abbrev-commit ao git log. Além disso, o manual do git afirma que não posso criar um alias: "Para evitar confusão e problemas com o uso do script, os aliases que ocultam os comandos git existentes são ignorados"

Minha terceira opção é inventar um novo alias como glog=log --abbrev-commitno meu arquivo .gitconfig. Mas prefiro não inventar meu próprio DSL com novos comandos.

Existe outra maneira de fazer isso para que o abbrev-commitsinalizador seja definido por padrão?

Jesper Rønn-Jensen
fonte
1
A partir do git 1.7.6, há um sinalizador para controlar esse comportamento. Veja a resposta de @underrun abaixo.
slacy de

Respostas:

58

Desde git versão 1.7.6, git config ganhou uma opção log.abbrevCommit que pode ser definida como true. Portanto, a resposta é atualizar para pelo menos 1.7.6 (o atual até o momento desta escrita é 1.7.11.4) e usar:

git config --global log.abbrevCommit true
underrun
fonte
2
Suponho que não haja uma opção para on-line?
Zaz
1
Estou aceitando essa resposta. É bom ver que o Git adicionou essa configuração desde que escrevi a pergunta há quase quatro anos.
Jesper Rønn-Jensen
Onde está a fonte de todas essas opções místicas?
xaxxon
Alguém conhece o sinalizador padrão para gráfico? Não consigo encontrar na página @xaxxon vinculada ..
myol
@myol, você deve usar git config --helpou git help configpara obter a documentação correspondente à sua instalação .
doak
46

Você pode usar um formato personalizado para git logimitar --abbrev-commitpor padrão:

git config format.pretty "format:%h %s"
Dahlbyk
fonte
Ótimo, essa é facilmente a melhor resposta.
duane
Você também pode usar cores durante a formatação: "% C (amarelo)% h% Creset% s" será apresentado como git log --oneline com cores.
Avner
1
Agora uma pergunta rápida: se você achou isso útil e responde exatamente ao problema, por que não marca como correto?
igorsantos07 01 de
1
Isso é melhor se você não quiser lembrar apelidos obscuros ou difíceis de lembrar e preferir apenas usar "git log" o tempo todo.
Shyam Habarakada
1
Essa foi a melhor resposta para mim. A log.abbrevCommitconfiguração afetou outros formatos mais detalhados, dos quais não gostei. Além disso, use %C(auto)%h %spara obter o formato oneline normal com coloração automática. Usei git config --global format.pretty "%C(auto)%h %d %s"porque queria decorar oneline como meu "padrão"
davenpcj
33

Não existe um mecanismo genérico no git para definir argumentos padrão para comandos.

Você pode usar git aliases para definir um novo comando com os argumentos necessários:

git config alias.lg "log --oneline"

Então você pode correr git lg.

Alguns comandos também possuem definições de configuração para alterar seu comportamento.

Hassen
fonte
12
Eu quero evitar criar minha própria sintaxe, então prefiro uma solução onde eu não use, git lgmasgit log
Jesper Rønn-Jensen
porque? Que diferença faria?
hasen,
46
A diferença muito importante é que não quero introduzir a "sintaxe git de Jespers" em meu sistema. Eu quero que eu (e outros que usam minha máquina) usemos os comandos genéricos. Além disso, isso tornará meu trabalho mais rápido em outras máquinas: não me preocupo em digitar acidentalmente "git lg" e receber um erro "não encontrado"
Jesper Rønn-Jensen
19
Se outra pessoa estava usando sua máquina e digitou git log, sua solução pretendida significaria que eles obteriam resultados inesperados.
Abizern
1
A redefinição de aliases padrão pode interromper os scripts.
justintime
10

VonC já sugeriu um invólucro de shell em sua resposta; aqui está minha implementação Bash de tal wrapper. Se você colocar isto, por exemplo, em seu .bashrc, seu shell interativo suportará a substituição de comandos embutidos do Git, bem como apelidos em maiúsculas.

# Git supports aliases defined in .gitconfig, but you cannot override Git
# builtins (e.g. "git log") by putting an executable "git-log" somewhere in the
# PATH. Also, git aliases are case-insensitive, but case can be useful to create
# a negated command (gf = grep --files-with-matches; gF = grep
# --files-without-match). As a workaround, translate "X" to "-x". 
git()
{
    typeset -r gitAlias="git-$1"
    if 'which' "$gitAlias" >/dev/null 2>&1; then
        shift
        "$gitAlias" "$@"
    elif [[ "$1" =~ [A-Z] ]]; then
        # Translate "X" to "-x" to enable aliases with uppercase letters. 
        translatedAlias=$(echo "$1" | sed -e 's/[A-Z]/-\l\0/g')
        shift
        "$(which git)" "$translatedAlias" "$@"
    else
        "$(which git)" "$@"
    fi
} 

Você pode então substituir git logcolocando um script nomeado git-logem algum lugar no seu PATH:

#!/bin/sh
git log --abbrev-commit "$@"
Ingo Karkat
fonte
7

Eu tenho um problema semelhante (muitas das opções padrão para comandos Git são burras). Aqui está minha abordagem. Crie um script chamado 'grit' (ou qualquer outro) em seu caminho, da seguinte maneira:

#!/bin/bash
cmd=$1
shift 1
if [ "$cmd" = "" ]; then
  git
elif [ $cmd = "log" ]; then
  git log --abbrev-commit $@
elif [ $cmd = "branch" ]; then
  git branch -v $@
elif [ $cmd = "remote" ]; then
  git remote -v $@
else
  git $cmd $@
fi

Muito simples de ler e manter, caso você precise compartilhá-lo com não especialistas em Bash.

Steve Bennett
fonte
Você realmente quer que "git remote blah" chame "git branch blah"? Estou usando uma variante disso, em que coloco git no início do caminho e chamo explicitamente / usr / bin / git em meu script. Sim, isso provavelmente quebra alguma coisa.
LovesTha
1
Gostei disso e fiz dois ajustes adicionais. Eu fiz isso uma função bash e deixá-lo ser nomeado gitpela adição de uma primeira linha para obter o caminho do comando real: thegit=`/usr/bin/which git`. E acrescentei uma opção para cancelar as substituições com um x antes do comando como git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg
0

Todos os utilitários que usamos (svn, maven, git, ...) são sempre encapsulados em um .bat (no Windows ou .sh no Unix), a fim de oferecer aos nossos desenvolvedores um diretório para adicionar ao seu caminho.

Se o git estiver encapsulado em um script wrapper, então ... tudo é possível.

Mas isso continua sendo uma solução vinculada à configuração do usuário, não vinculada ao Git em si ou ao repositório git.

VonC
fonte
Então você quer dizer que devo conseguir isso adicionando um alias ao meu .bash_profile?
Jesper Rønn-Jensen
@Jesper: essa é a ideia, já que seu wrapper git.bat será capaz de detectar qual comando Git você deseja executar e poderá adicionar qualquer opção que desejar.
VonC