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?


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

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"

Ó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.


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 "$@"

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.