Setzen von Git-Standardflags für Befehle

88

Ich möchte wissen, ob es eine Möglichkeit gibt, standardmäßig ein Flag für den Befehl git zu setzen. Insbesondere möchte ich das --abbrev-commitFlag so setzen, dass git logich es beim Ausführen ausführen möchte git log --abbrev-commit.

Im Gegensatz zu der Frage " Gibt es eine Möglichkeit, ein Flag standardmäßig für einen Git-Befehl zu setzen? " Gibt es anscheinend kein Konfigurationsflag zum Hinzufügen von --abbrev-commit zum Git-Protokoll. Darüber hinaus heißt es im Git-Handbuch, dass ich keinen Alias ​​erstellen kann: "Um Verwirrung und Probleme bei der Skriptverwendung zu vermeiden, werden Aliase, die vorhandene Git-Befehle verbergen, ignoriert."

Meine dritte Option besteht darin, einen neuen Alias ​​wie glog=log --abbrev-commitin meiner .gitconfig-Datei zu erfinden . Aber ich möchte lieber kein eigenes DSL mit neuen Befehlen erfinden.

Gibt es eine andere Möglichkeit, dies zu erreichen, sodass das abbrev-commitFlag standardmäßig gesetzt ist?

Jesper Rønn-Jensen
quelle
1
Ab Git 1.7.6 gibt es ein Flag, um dieses Verhalten zu steuern. Siehe die Antwort von @underrun unten.
Slacy

Antworten:

58

Seit der Git-Version 1.7.6 hat die Git-Konfiguration eine log.abbrevCommit-Option erhalten, die auf true gesetzt werden kann. Daher lautet die Antwort "Upgrade auf mindestens 1.7.6" (derzeit Stand 1.7.11.4) und folgende Verwendung:

git config --global log.abbrevCommit true
unterlaufen
quelle
2
Nehmen Sie nicht an, dass es eine Option für Online gibt?
Zaz
1
Ich akzeptiere diese Antwort. Schön zu sehen, dass Git diese Konfiguration hinzugefügt hat, seit ich die Frage vor fast vier Jahren geschrieben habe.
Jesper Rønn-Jensen
Woher stammen all diese mystischen Optionen?
Xaxxon
Kennt jemand das Standardflag für Grafik? Ich kann es nicht auf der Seite @xaxxon verlinkt finden ..
myol
@myol, sollten Sie git config --helpoder verwenden git help config, um die Dokumentation zu erhalten, die zu Ihrer Installation passt .
Doak
46

Sie können ein benutzerdefiniertes Format verwenden, git logum --abbrev-commitstandardmäßig zu imitieren :

git config format.pretty "format:%h %s"
Dahlbyk
quelle
Großartig, das ist einfach die beste Antwort.
Duane
Sie können beim Formatieren auch Farben verwenden: "% C (gelb)% h% Creset% s" wird wie ein Git-Protokoll angezeigt - online mit Farben.
Avner
1
Nun eine kurze Frage: Wenn Sie dies nützlich fanden und dies genau das Problem beantwortet, warum markieren Sie dies nicht als richtig?
igorsantos07
1
Dies ist besser, wenn Sie sich nicht an obskure oder schwer zu merkende Aliase erinnern möchten und es vorziehen, immer nur "Git Log" zu verwenden.
Shyam Habarakada
1
Dies war die beste Antwort für mich. Die log.abbrevCommitEinstellung wirkte sich auf andere ausführlichere Formate aus, die mir nicht gefallen haben. Verwenden Sie %C(auto)%h %sdiese Option auch, um das normale Online-Format mit automatischer Farbgebung zu erhalten. Ich habe verwendet, git config --global format.pretty "%C(auto)%h %d %s"weil ich online als meine "Standardeinstellung" dekorieren wollte
davenpcj
33

In git gibt es keinen generischen Mechanismus zum Festlegen von Standardargumenten für Befehle.

Sie können Git-Aliase verwenden , um einen neuen Befehl mit den erforderlichen Argumenten zu definieren:

git config alias.lg "log --oneline"

Dann kannst du rennen git lg.

Einige Befehle verfügen auch über Konfigurationseinstellungen, um ihr Verhalten zu ändern.

hasen
quelle
12
Ich möchte vermeiden, meine eigene Syntax zu erstellen, deshalb würde ich eine Lösung bevorzugen, bei der ich git lgnurgit log
Jesper Rønn-Jensen
Warum? Welchen Unterschied würde es machen?
hasen
46
Der sehr wichtige Unterschied ist, dass ich auf meinem System keine "Jespers-Git-Syntax" einführen möchte. Ich möchte, dass ich (und andere, die meinen Computer verwenden) die generischen Befehle verwenden. Dies beschleunigt auch meine Arbeit auf anderen Computern: Ich mache mir keine Sorgen, dass ich versehentlich "git lg" eingebe und einen "nicht gefundenen" Fehler
erhalte
19
Wenn jemand anderes Ihren Computer verwendet und git log eingibt, würde Ihre beabsichtigte Lösung bedeuten, dass er Ergebnisse erzielt, die er nicht erwartet hat.
Abizern
1
Durch die Neudefinition von Standard-Aliasnamen können Skripte beschädigt werden.
Justintime
10

VonC hat in seiner Antwort bereits auf einen Shell Wrapper hingewiesen; Hier ist meine Bash-Implementierung eines solchen Wrappers. Wenn Sie dies zB in Ihre einfügen .bashrc, unterstützt Ihre interaktive Shell das Überschreiben von in Git integrierten Befehlen sowie von Aliasnamen in Großbuchstaben.

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

Sie können dann überschreiben, git logindem Sie ein Skript mit dem Namen git-logirgendwo in Ihren PFAD einfügen:

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

Ich habe ein ähnliches Problem (viele der Standardoptionen für Git-Befehle sind dumm). Hier ist mein Ansatz. Erstellen Sie ein Skript mit dem Namen "grit" (oder was auch immer) auf Ihrem Pfad wie folgt:

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

Sehr einfach zu lesen und zu warten, falls Sie es mit Bash-Nicht-Experten teilen müssen.

Steve Bennett
quelle
Möchten Sie wirklich, dass "git remote blah" "git branch blah" nennt? Ich verwende eine Variante davon, bei der ich git früher in den Pfad eingefügt und dann explizit / usr / bin / git in meinem Skript aufgerufen habe. Ja, das bricht wahrscheinlich etwas.
LovesTha
1
Ich mochte das und machte zwei zusätzliche Verbesserungen. Ich habe es zu einer Bash-Funktion gemacht und es gitdurch Hinzufügen einer ersten Zeile benannt, um den tatsächlichen Befehlspfad zu erhalten : thegit=`/usr/bin/which git`. Und ich habe eine Option hinzugefügt, um die Überschreibungen mit einem x vor dem Befehl abzubrechen, wie git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg
0

Jedes von uns verwendete Dienstprogramm (svn, maven, git, ...) ist immer in einer .bat-Datei (unter Windows oder .sh unter Unix) gekapselt, um unseren Entwicklern ein Verzeichnis anzubieten, das sie ihrem Pfad hinzufügen können.

Wenn git in einem Wrapper-Skript gekapselt ist, ist ... alles möglich.

Dies bleibt jedoch eine Lösung, die mit dem Setup des Benutzers verknüpft ist und nicht mit Git selbst oder dem Git-Repo.

VonC
quelle
Du meinst also, ich sollte es erreichen können, indem ich meinem .bash_profile einen Alias ​​hinzufüge?
Jesper Rønn-Jensen
@Jesper: Das ist die Idee, da Ihr Wrapper git.bat erkennen kann, welchen Git-Befehl Sie ausführen möchten, und jede gewünschte Option hinzufügen kann.
VonC