Configuración de banderas predeterminadas de git en los comandos

89

Quiero saber si hay una forma de establecer una bandera por defecto para el comando git. Específicamente, quiero configurar la --abbrev-commitbandera para que al ejecutar git log, quiera ejecutar git log --abbrev-commit.

A diferencia de la pregunta " ¿hay alguna forma de establecer una bandera por defecto para un comando git? ", Aparentemente no hay una bandera de configuración para agregar --abbrev-commit a git log. Además, el manual de git establece que no puedo crear un alias: "Para evitar confusiones y problemas con el uso del script, se ignoran los alias que ocultan los comandos de git existentes".

Mi tercera opción es inventar un nuevo alias como glog=log --abbrev-commiten mi archivo .gitconfig. Pero prefiero no inventar mi propio DSL con nuevos comandos.

¿Hay otra forma de lograrlo para que la abbrev-commitbandera esté configurada por defecto?

Jesper Rønn-Jensen
fuente
1
A partir de git 1.7.6 hay una bandera para controlar este comportamiento. Vea la respuesta de @underrun a continuación.
slacy

Respuestas:

59

Desde la versión 1.7.6 de git, git config ha obtenido una opción log.abbrevCommit que se puede establecer en true. Por lo tanto, la respuesta es actualizar a al menos 1.7.6 (el actual al momento de escribir este artículo es 1.7.11.4) y usar:

git config --global log.abbrevCommit true
insuficiente
fuente
2
¿No crees que hay una opción para online?
Zaz
1
Acepto esta respuesta. Es bueno ver que Git agregó esta configuración desde que escribí la pregunta hace casi cuatro años.
Jesper Rønn-Jensen
¿Dónde está la fuente de todas estas opciones místicas?
xaxxon
¿Alguien conoce la bandera predeterminada para el gráfico? No puedo encontrarlo en la página @xaxxon vinculada ..
myol
@myol, debe usar git config --helpo git help configpara obtener la documentación correspondiente a su instalación .
Doak
46

Puede usar un formato personalizado para tener una git logmímica --abbrev-commitpor defecto:

git config format.pretty "format:%h %s"
Dalbyk
fuente
Genial, esta es fácilmente la mejor respuesta.
duane
También puede usar colores mientras formatea: "% C (amarillo)% h% Creset% s" se presentará como git log - en línea con colores.
Avner
1
Ahora una pregunta rápida: si encuentra esto útil y responde exactamente al problema, ¿por qué no lo marca como correcto?
igorsantos07
1
Esto es mejor si no quiere recordar alias oscuros o difíciles de recordar y prefiere usar "git log" todo el tiempo.
Shyam Habarakada
1
Esta fue la mejor respuesta para mí. La log.abbrevCommitconfiguración afectó a otros formatos más detallados, lo que no me gustó. Además, utilícelo %C(auto)%h %spara obtener el formato en línea normal con coloración automática. Solía git config --global format.pretty "%C(auto)%h %d %s"porque quería decorado oneline como mi "default"
davenpcj
34

No hay un mecanismo genérico en git para establecer argumentos predeterminados para los comandos.

Puede usar los alias de git para definir un nuevo comando con los argumentos requeridos:

git config alias.lg "log --oneline"

Entonces puedes correr git lg.

Algunos comandos también tienen opciones de configuración para cambiar su comportamiento.

hasen
fuente
12
Quiero evitar crear mi propia sintaxis, así que preferiría una solución en la que no use git lgperogit log
Jesper Rønn-Jensen
¿por qué? ¿Qué diferencia haría?
Hasen
46
La diferencia muy importante es que no quiero introducir la "sintaxis git de Jespers" en mi sistema. Quiero que yo (y otros que usen mi máquina) use los comandos genéricos. Además, esto hará que mi trabajo sea más rápido en otras máquinas: no me preocupo por escribir accidentalmente "git lg" y obtener un error de "no encontrado"
Jesper Rønn-Jensen
19
Si alguien más estuviera usando su máquina y escribiera git log, su solución prevista significaría que obtendría resultados que no esperaba.
Abizern
1
Redefinir los alias estándar puede romper los scripts.
justo a la hora
10

VonC ya ha insinuado un envoltorio de concha en su respuesta; aquí está mi implementación Bash de dicha envoltura. Si pones esto, por ejemplo, en tu .bashrc, tu shell interactivo admitirá la anulación de los comandos integrados de Git, así como los alias en mayú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
} 

Luego puede anular git logcolocando un script llamado git-logen algún lugar de su RUTA:

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

Tengo un problema similar (muchas de las opciones predeterminadas para los comandos de Git son tontas). Este es mi enfoque. Cree un script llamado 'grit' (o lo que sea) en su camino, de la siguiente manera:

#!/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

Muy sencillo de leer y mantener, en caso de que necesite compartirlo con no expertos en Bash.

Steve Bennett
fuente
¿De verdad quieres que "git remote blah" llame a "git branch blah"? Estoy usando una variante de esto donde coloco git antes en la ruta y luego llamo explícitamente / usr / bin / git en mi script. Sí, esto probablemente rompe algo.
LovesTha
1
Me gustó esto e hice dos ajustes adicionales. Lo hice una función fiesta y que sea nombrado gitmediante la adición de una primera línea de obtener la ruta de comandos real: thegit=`/usr/bin/which git`. Y añadí una opción de cancelar las anulaciones con una x antes de que el comando como git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg
0

Todas las utilidades que utilizamos (svn, maven, git, ...) siempre están encapsuladas en un .bat (en Windows o .sh en Unix), para ofrecer a nuestros desarrolladores un directorio para agregar a su ruta.

Si git está encapsulado en un script contenedor, entonces ... todo es posible.

Pero esa sigue siendo una solución vinculada a la configuración del usuario, no vinculada a Git en sí o al repositorio de git.

VonC
fuente
Entonces, ¿quieres decir que debería poder lograrlo agregando un alias a mi .bash_profile?
Jesper Rønn-Jensen
@Jesper: esa es la idea, ya que su contenedor git.bat podrá detectar qué comando de Git desea ejecutar y podría agregar cualquier opción que desee.
VonC