Impostazione dei flag predefiniti di git sui comandi


88

Voglio sapere se c'è un modo per impostare un flag di default per il comando git. In particolare, voglio impostare il --abbrev-commitflag in modo che durante l'esecuzione git log, voglio eseguire git log --abbrev-commit.

A differenza della domanda " c'è un modo per impostare un flag di default per un comando git? ", Apparentemente non c'è un flag di configurazione per aggiungere --abbrev-commit a git log. Inoltre, il manuale di git afferma che non posso creare un alias: "Per evitare confusione e problemi con l'utilizzo degli script, gli alias che nascondono i comandi git esistenti vengono ignorati"

La mia terza opzione è inventare un nuovo alias come glog=log --abbrev-commitnel mio file .gitconfig. Ma preferisco non inventare il mio DSL con nuovi comandi.

C'è un altro modo per ottenerlo in modo che il abbrev-commitflag sia impostato di default ??


1
A partire da git 1.7.6 esiste un flag per controllare questo comportamento. Vedi la risposta di @underrun di seguito.
slacy

Risposte:


58

Dalla versione 1.7.6 di git, git config ha ottenuto un'opzione log.abbrevCommit che può essere impostata su true. Quindi la risposta è aggiornare almeno a 1.7.6 (l'attuale al momento della stesura di questo articolo è 1.7.11.4) e utilizzare:

git config --global log.abbrevCommit true

2
Non supponi che ci sia un'opzione per oneline?
Zaz

1
Accetto questa risposta. È bello vedere che Git ha aggiunto questa configurazione da quando ho scritto la domanda quasi quattro anni fa.
Jesper Rønn-Jensen

Dov'è la fonte di tutte queste opzioni mistiche?
xaxxon

Qualcuno conosce la bandiera predefinita per il grafico? Non riesco a trovarlo nella pagina @xaxxon collegata ..
myol

@myol, dovresti usare git config --helpo git help configper ottenere la documentazione corrispondente alla tua installazione .
doak

46

Puoi utilizzare un formato personalizzato per avere git logmimic --abbrev-commitper impostazione predefinita:

git config format.pretty "format:%h %s"

Fantastico, questa è facilmente la risposta migliore.
duane

Puoi anche usare i colori durante la formattazione: "% C (giallo)% h% Creset% s" si presenterà come git log --oneline con i colori.
Avner

1
Ora una domanda veloce: se hai trovato questo utile e questo risponde esattamente al problema, perché non lo contrassegni come corretto?
igorsantos07

1
Questo è meglio se non vuoi ricordare alias oscuri o difficili da ricordare e preferisci usare sempre "git log".
Shyam Habarakada

1
Questa è stata la risposta migliore per me. L' log.abbrevCommitimpostazione ha influenzato altri formati più dettagliati, che non mi sono piaciuti. Inoltre, utilizzare %C(auto)%h %sper ottenere il normale formato in linea con la colorazione automatica. L'ho usato git config --global format.pretty "%C(auto)%h %d %s"perché volevo decorato in linea come "impostazione predefinita"
davenpcj

33

Non esiste un meccanismo generico in git per impostare gli argomenti predefiniti per i comandi.

Puoi utilizzare gli alias git per definire un nuovo comando con gli argomenti richiesti:

git config alias.lg "log --oneline"

Allora puoi correre git lg.

Alcuni comandi hanno anche impostazioni di configurazione per modificare il loro comportamento.


12
Voglio evitare di creare la mia sintassi, quindi preferirei una soluzione in cui non uso git lgmagit log
Jesper Rønn-Jensen

perché? che differenza farebbe?
hasen

46
La differenza molto importante è che non voglio introdurre "Jespers git syntax" sul mio sistema. Voglio che io (e altri che usano la mia macchina) usino i comandi generici. Inoltre, questo renderà il mio lavoro più veloce su altre macchine: non mi preoccupo di digitare accidentalmente "git lg" e di ricevere un errore "non trovato"
Jesper Rønn-Jensen

19
Se qualcun altro stava usando la tua macchina e ha digitato git log, la soluzione prevista significherebbe che otterrebbero risultati che non si aspettavano.
Abizern

1
La ridefinizione degli alias standard può rompere gli script.
justintime

10

VonC ha già accennato a un involucro di shell nella sua risposta; ecco la mia implementazione Bash di un tale wrapper. Se metti questo, ad esempio, nel tuo .bashrc, la tua shell interattiva supporterà l'override dei comandi incorporati di Git così come degli alias maiuscoli.

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

Puoi quindi eseguire l'override git loginserendo uno script chiamato git-logda qualche parte nel tuo PERCORSO:

#!/bin/sh
git log --abbrev-commit "$@"

7

Ho un problema simile (molte delle opzioni predefinite per i comandi Git sono stupide). Ecco il mio approccio. Crea uno script chiamato 'grit' (o qualsiasi altra cosa) sul tuo percorso, come segue:

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

Molto semplice da leggere e mantenere, nel caso in cui sia necessario condividerlo con i non esperti di Bash.


Vuoi davvero che "git remote blah" chiami "git branch blah"? Sto usando una variante di questo in cui ho inserito git in precedenza nel percorso e quindi ho chiamato esplicitamente / usr / bin / git nel mio script. Sì, questo probabilmente rompe qualcosa.
LovesTha

1
Mi è piaciuto e ho apportato altre due modifiche. Ho fatto una funzione bash e lascia che sia il nome gitcon l'aggiunta di una prima linea per ottenere il vero e proprio percorso di comando: thegit=`/usr/bin/which git`. E ho aggiunto un'opzione di annullare le sostituzioni con una x prima che il comando come git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg


0

Ogni utility che utilizziamo (svn, maven, git, ...) è sempre incapsulata in un .bat (su Windows o .sh su Unix), in modo da offrire ai nostri sviluppatori una directory da aggiungere al loro percorso.

Se git è incapsulato in uno script wrapper, allora ... tutto è possibile.

Ma questa rimane una soluzione legata alla configurazione dell'utente, non collegata a Git stesso o al repository git.


Quindi vuoi dire che dovrei essere in grado di ottenerlo aggiungendo alias al mio .bash_profile?
Jesper Rønn-Jensen

@Jesper: questa è l'idea, dal momento che il tuo wrapper git.bat sarà in grado di rilevare quale comando Git vuoi eseguire e potrebbe aggiungere qualsiasi opzione desideri.
VonC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.