Ustawianie domyślnych flag git w poleceniach

89

Chcę wiedzieć, czy istnieje sposób na ustawienie flagi domyślnie dla polecenia git. W szczególności chcę ustawić --abbrev-commitflagę, aby podczas wykonywania git logchcę wykonać git log --abbrev-commit.

W przeciwieństwie do pytania „ czy istnieje sposób na ustawienie domyślnej flagi dla polecenia git? ”, Najwyraźniej nie ma flagi konfiguracyjnej do dodania --abbrev-commit do git log. Ponadto podręcznik git stwierdza, że ​​nie mogę utworzyć aliasu: „Aby uniknąć nieporozumień i problemów z używaniem skryptów, aliasy ukrywające istniejące polecenia git są ignorowane”

Moją trzecią opcją jest wymyślenie nowego aliasu, takiego jak glog=log --abbrev-commitw moim pliku .gitconfig. Ale wolałbym nie wymyślać własnego DSL z nowymi poleceniami.

Czy jest inny sposób na osiągnięcie tego, aby abbrev-commitflaga była ustawiona domyślnie?

Jesper Rønn-Jensen
źródło
1
Od wersji 1.7.6 gita istnieje flaga kontrolująca to zachowanie. Zobacz odpowiedź @underrun poniżej.
slacy

Odpowiedzi:

59

Od wersji 1.7.6 git, konfiguracja git zyskała opcję log.abbrevCommit, którą można ustawić na wartość true. Tak więc odpowiedzią jest aktualizacja do co najmniej 1.7.6 (aktualna w chwili pisania tego tekstu to 1.7.11.4) i użyj:

git config --global log.abbrevCommit true
underrun
źródło
2
Nie sądzisz, że istnieje opcja online?
Zaz
1
Przyjmuję tę odpowiedź. Miło widzieć, że Git dodał tę konfigurację, odkąd napisałem to pytanie prawie cztery lata temu.
Jesper Rønn-Jensen
Gdzie jest źródło tych wszystkich mistycznych opcji?
xaxxon
Czy ktoś zna domyślną flagę dla wykresu? Nie mogę go znaleźć na stronie @xaxxon link…
myol
@myol, powinieneś użyć git config --helplub git help configuzyskać dokumentację pasującą do twojej instalacji .
doak
46

Możesz użyć formatu niestandardowego, aby domyślnie git lognaśladować --abbrev-commit:

git config format.pretty "format:%h %s"
dahlbyk
źródło
Świetnie, to z pewnością najlepsza odpowiedź.
duane
Możesz także używać kolorów podczas formatowania: "% C (żółty)% h% Creset% s" będzie wyglądał jak git log --oneline z kolorami.
Avner
1
Teraz krótkie pytanie: jeśli uznasz to za przydatne i to dokładnie odpowiada na problem, dlaczego nie oznaczysz tego jako poprawnego?
igorsantos 07
1
Jest to lepsze, jeśli nie chcesz pamiętać niejasnych lub trudnych do zapamiętania aliasów i wolisz po prostu używać „git log” przez cały czas.
Shyam Habarakada
1
To była dla mnie najlepsza odpowiedź. To log.abbrevCommitustawienie wpłynęło na inne, bardziej szczegółowe formaty, które mi się nie podobały. %C(auto)%h %sSłuży również do uzyskania normalnego formatu online z automatycznym kolorowaniem. Użyłem, git config --global format.pretty "%C(auto)%h %d %s"ponieważ chciałem ozdobić go na linii jako moje „domyślne”
davenpcj
34

W git nie ma ogólnego mechanizmu ustawiania domyślnych argumentów dla poleceń.

Możesz użyć aliasów git, aby zdefiniować nowe polecenie z wymaganymi argumentami:

git config alias.lg "log --oneline"

Wtedy możesz biec git lg.

Niektóre polecenia mają również ustawienia konfiguracyjne umożliwiające zmianę ich zachowania.

hasen
źródło
12
Chcę uniknąć tworzenia własnej składni, więc wolałbym rozwiązanie, w którym nie używam, git lgalegit log
Jesper Rønn-Jensen
czemu? jaka to różnica?
hasen
46
Bardzo ważną różnicą jest to, że nie chcę wprowadzać „składni gita Jespersa” do swojego systemu. Chcę, abyśmy (i inne osoby korzystające z mojego komputera) używały ogólnych poleceń. Poza tym przyspieszy to moją pracę na innych maszynach: nie martwię się przypadkowym wpisaniem „git lg” i wyświetleniem błędu „nie znaleziono”
Jesper Rønn-Jensen
19
Jeśli ktoś inny używałby twojego komputera i wpisał git log, twoje zamierzone rozwiązanie oznaczałoby, że uzyska wyniki, których się nie spodziewał.
Abizern
1
Przedefiniowanie standardowych aliasów może spowodować uszkodzenie skryptów.
justintime
10

VonC już zasugerował w swojej odpowiedzi opakowanie po muszli; oto moja implementacja Bash takiego opakowania. Jeśli umieścisz to np. W swoim .bashrc, twoja interaktywna powłoka będzie obsługiwać nadpisywanie wbudowanych poleceń Git, jak również aliasów pisanych dużymi literami.

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

Możesz wtedy nadpisać git log, umieszczając skrypt nazwany git-loggdzieś w swojej PATH:

#!/bin/sh
git log --abbrev-commit "$@"
Ingo Karkat
źródło
7

Mam podobny problem (wiele domyślnych opcji poleceń Gita jest głupich). Oto moje podejście. Utwórz na swojej ścieżce skrypt o nazwie „grit” (lub cokolwiek innego) w następujący sposób:

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

Bardzo proste w czytaniu i utrzymaniu, na wypadek, gdybyś musiał udostępnić go nie-ekspertom Bash.

Steve Bennett
źródło
Czy naprawdę chcesz, aby „git remote blah” nazywał „git branch blah”? Używam wariantu tego, w którym umieszczam git wcześniej w ścieżce, a następnie jawnie wywołuję / usr / bin / git w moim skrypcie. Tak, to prawdopodobnie coś psuje.
LovesTha
1
Podobało mi się to i wprowadziłem dwie dodatkowe poprawki. Zrobiłem to funkcja bash i niech będzie nazwany gitprzez dodanie pierwszej kolejce prawdziwą ścieżkę polecenia: thegit=`/usr/bin/which git`. I dodałem opcję, aby anulować nadpisania literą x przed poleceniem git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Joshua Goldberg
0

Każde narzędzie, którego używamy (svn, maven, git, ...) jest zawsze zawarte w pliku .bat (w systemie Windows lub .sh w systemie Unix), aby zaoferować naszym programistom jeden katalog do dodania do ich ścieżki.

Jeśli git jest zamknięty w skrypcie opakowującym, to ... wszystko jest możliwe.

Ale to pozostaje rozwiązanie powiązane z konfiguracją użytkownika, a nie połączone z samym Gitem ani repozytorium git.

VonC
źródło
Więc masz na myśli, że powinienem być w stanie to osiągnąć, dodając alias do mojego .bash_profile?
Jesper Rønn-Jensen
@Jesper: taka jest idea, ponieważ twój wrapper git.bat będzie w stanie wykryć, jakie polecenie Git chcesz wykonać i może dodać dowolną opcję, jaką chce.
VonC