Définition des indicateurs par défaut de git sur les commandes

88

Je veux savoir s'il existe un moyen de définir un indicateur par défaut pour la commande git. Plus précisément, je souhaite définir l' --abbrev-commitindicateur de sorte que lors de l'exécution git log, je souhaite exécuter git log --abbrev-commit.

Contrairement à la question " y a-t-il un moyen de définir un indicateur par défaut pour une commande git? ", Il n'y a apparemment pas d'indicateur de configuration pour ajouter --abbrev-commit à git log. De plus, le manuel git déclare que je ne peux pas créer d'alias: "Pour éviter toute confusion et problèmes liés à l'utilisation du script, les alias qui masquent les commandes git existantes sont ignorés"

Ma troisième option est d'inventer un nouvel alias comme glog=log --abbrev-commitdans mon fichier .gitconfig. Mais je préfère ne pas inventer mon propre DSL avec de nouvelles commandes.

Y a-t-il un autre moyen d'y parvenir afin que le abbrev-commitdrapeau soit défini par défaut?

Jesper Rønn-Jensen
la source
1
Depuis git 1.7.6, il existe un indicateur pour contrôler ce comportement. Voir la réponse de @underrun ci-dessous.
slacy

Réponses:

58

Depuis la version 1.7.6 de git, git config a gagné une option log.abbrevCommit qui peut être définie sur true. Ainsi, la réponse est la mise à niveau vers au moins 1.7.6 (la version actuelle à ce jour est la 1.7.11.4) et l'utilisation:

git config --global log.abbrevCommit true
underrun
la source
2
Vous ne pensez pas qu'il existe une option en ligne?
Zaz
1
J'accepte cette réponse. C'est bien de voir que Git a ajouté cette configuration depuis que j'ai écrit la question il y a près de quatre ans.
Jesper Rønn-Jensen
Où est la source de toutes ces options mystiques?
xaxxon
Quelqu'un connaît-il le drapeau par défaut du graphique? Je ne le trouve pas dans la page liée à @xaxxon ..
myol
@myol, vous devez utiliser git config --helpou git help configpour obtenir la documentation correspondant à votre installation .
doak
46

Vous pouvez utiliser un format personnalisé pour avoir une git logmimique --abbrev-commitpar défaut:

git config format.pretty "format:%h %s"
Dahlbyk
la source
Génial, c'est facilement la meilleure réponse.
duane
Vous pouvez également utiliser des couleurs lors du formatage: "% C (jaune)% h% Creset% s" se présentera comme git log --oneline avec des couleurs.
Avner
1
Maintenant, une question rapide: si vous avez trouvé cela utile et que cela répond exactement au problème, pourquoi ne pas marquer cela comme correct?
igorsantos07
1
C'est mieux si vous ne voulez pas vous souvenir d'alias obscurs ou difficiles à retenir et préférez simplement utiliser "git log" tout le temps.
Shyam Habarakada
1
C'était la meilleure réponse pour moi. Le log.abbrevCommitparamètre affectait d'autres formats plus verbeux, ce que je n'aimais pas. Utilisez également %C(auto)%h %spour obtenir le format en ligne normal avec coloration automatique. J'ai utilisé git config --global format.pretty "%C(auto)%h %d %s"parce que je voulais décoré en ligne comme "par défaut"
davenpcj
33

Il n'y a pas de mécanisme générique dans git pour définir les arguments par défaut des commandes.

Vous pouvez utiliser des alias git pour définir une nouvelle commande avec les arguments requis:

git config alias.lg "log --oneline"

Ensuite, vous pouvez courir git lg.

Certaines commandes ont également des paramètres de configuration pour modifier leur comportement.

hasen
la source
12
Je veux éviter de créer ma propre syntaxe, donc je préfère une solution où je n'utilise pas git lgmaisgit log
Jesper Rønn-Jensen
Pourquoi? quelle différence cela ferait-il?
hasen le
46
La différence très importante est que je ne veux pas introduire "Jespers git syntax" sur mon système. Je veux que moi (et les autres utilisateurs de ma machine) utilisent les commandes génériques. De plus, cela rendra mon travail plus rapide sur d'autres machines: je ne crains pas de taper accidentellement "git lg" et d'obtenir une erreur "introuvable"
Jesper Rønn-Jensen
19
Si quelqu'un d'autre utilisait votre machine et tapait git log, votre solution prévue signifierait qu'il obtiendrait des résultats auxquels il ne s'attendait pas.
Abizern
1
La redéfinition des alias standard peut interrompre les scripts.
justintime
10

VonC a déjà fait allusion à un wrapper shell dans sa réponse; voici mon implémentation Bash d'un tel wrapper. Si vous mettez cela par exemple dans votre .bashrc, votre shell interactif prendra en charge le remplacement des commandes intégrées de Git ainsi que des alias en majuscules.

# 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
} 

Vous pouvez ensuite remplacer git logen mettant un script nommé git-logquelque part dans votre PATH:

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

J'ai un problème similaire (la plupart des options par défaut pour les commandes Git sont stupides). Voici mon approche. Créez un script appelé 'grit' (ou autre) sur votre chemin, comme suit:

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

Très simple à lire et à maintenir, au cas où vous auriez besoin de le partager avec des non-experts de Bash.

Steve Bennett
la source
Voulez-vous vraiment que "git remote blah" appelle "git branch blah"? J'utilise une variante de ceci où j'ai mis git plus tôt dans le chemin, puis j'appelle explicitement / usr / bin / git dans mon script. Ouais, ça casse probablement quelque chose.
LovesTha
1
J'ai aimé cela et j'ai apporté deux modifications supplémentaires. Je l' ai fait une fonction bash et que ce soit le nom giten ajoutant une première ligne pour obtenir le chemin de commande réel: thegit=`/usr/bin/which git`. Et j'ai ajouté une option pour annuler les remplacements avec un x avant la commande comme git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg
0

Tous les utilitaires que nous utilisons (svn, maven, git, ...) sont toujours encapsulés dans un .bat (sous Windows, ou .sh sous Unix), afin d'offrir à nos développeurs un répertoire à ajouter à leur chemin.

Si git est encapsulé dans un script wrapper, alors ... tout est possible.

Mais cela reste une solution liée à la configuration de l'utilisateur, non liée à Git lui-même ou au repo git.

VonC
la source
Vous voulez dire que je devrais pouvoir y parvenir en ajoutant un alias à mon .bash_profile?
Jesper Rønn-Jensen
@Jesper: c'est l'idée, puisque votre wrapper git.bat sera capable de détecter la commande Git que vous souhaitez exécuter et pourra ajouter n'importe quelle option.
VonC