Установка флагов git по умолчанию для команд

89

Я хочу знать, есть ли способ установить флаг по умолчанию для команды git. В частности, я хочу установить --abbrev-commitфлаг, чтобы при выполнении git logя хотел выполнить git log --abbrev-commit.

В отличие от вопроса « есть ли способ установить флаг по умолчанию для команды git? », Очевидно, нет флага конфигурации для добавления --abbrev-commit в журнал git. Кроме того, в руководстве по git указано, что я не могу создать псевдоним: «Чтобы избежать путаницы и проблем с использованием сценария, псевдонимы, скрывающие существующие команды git, игнорируются»

Мой третий вариант - придумать новый псевдоним, как glog=log --abbrev-commitв моем файле .gitconfig. Но я бы предпочел не изобретать собственный DSL с новыми командами.

Есть ли другой способ добиться этого, чтобы abbrev-commitфлаг был установлен по умолчанию ??

Джеспер Рённ-Йенсен
источник
1
Начиная с git 1.7.6 есть флаг для управления этим поведением. См. Ответ @underrun ниже.
slacy

Ответы:

59

Начиная с версии git 1.7.6, в git config появилась опция log.abbrevCommit, для которой можно установить значение true. Таким образом, ответ - обновление как минимум до версии 1.7.6 (на момент написания этой статьи - 1.7.11.4) и использование:

git config --global log.abbrevCommit true
опускание
источник
2
Не думаете, что есть вариант для oneline?
Zaz
1
Я принимаю этот ответ. Приятно видеть, что Git добавил эту конфигурацию, поскольку я написал вопрос почти четыре года назад.
Джеспер Рённ-Йенсен
Где источник всех этих мистических вариантов?
xaxxon
Кто-нибудь знает флаг по умолчанию для графика? Я не могу найти его на странице, связанной с @xaxxon ..
myol 03
@myol, вы должны использовать git config --helpили, git help configчтобы получить документацию, соответствующую вашей установке .
doak
46

Вы можете использовать собственный формат для git logимитации --abbrev-commitпо умолчанию:

git config format.pretty "format:%h %s"
Dahlbyk
источник
Отлично, это лучший ответ.
Дуэйн
Вы также можете использовать цвета при форматировании: «% C (желтый)% h% Creset% s» будет отображаться как git log --oneline с цветами.
Avner
1
А теперь быстрый вопрос: если вы нашли это полезным и это точно отвечает на проблему, почему бы вам не отметить это как правильное?
igorsantos07 01
1
Это лучше, если вы не хотите запоминать непонятные или трудно запоминаемые псевдонимы и предпочитаете все время просто использовать "git log".
Шьям Хабаракада
1
Для меня это был лучший ответ. log.abbrevCommitПараметр влияет другое Подробней форматов, которые я не делал подобного. Также используйте, %C(auto)%h %sчтобы получить обычный однострочный формат с автоматической раскраской. Я использовал, git config --global format.pretty "%C(auto)%h %d %s"потому что хотел, чтобы "линия по умолчанию" была
украшена
34

В git нет универсального механизма для установки аргументов по умолчанию для команд.

Вы можете использовать псевдонимы git, чтобы определить новую команду с необходимыми аргументами:

git config alias.lg "log --oneline"

Тогда можешь бежать git lg.

Некоторые команды также имеют параметры конфигурации для изменения их поведения.

hasen
источник
12
Я хочу избежать создания собственного синтаксиса, поэтому я бы предпочел решение, в котором я не использую, git lgноgit log
Джеспер Рённ-Йенсен,
Зачем? какая разница?
hasen
46
Очень важное отличие состоит в том, что я не хочу вводить "синтаксис Jespers git" в моей системе. Я хочу, чтобы я (и другие пользователи моей машины) использовали общие команды. Кроме того, это ускорит мою работу на других машинах: я не беспокоюсь о том, что случайно наберу «git lg» и
получу
19
Если бы кто-то другой использовал вашу машину и набрал git log, ваше предполагаемое решение означало бы, что он получит результаты, которых они не ожидали.
Abizern
1
Переопределение стандартных псевдонимов может нарушить работу скриптов.
Justintime
10

VonC уже намекнул на оболочку оболочки в своем ответе; вот моя реализация такой оболочки на Bash. Если вы поместите это, например, в свой .bashrc, ваша интерактивная оболочка будет поддерживать переопределение встроенных команд Git, а также псевдонимов верхнего регистра.

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

Затем вы можете переопределить git log, поместив скрипт с именем git-logгде-нибудь в свой PATH:

#!/bin/sh
git log --abbrev-commit "$@"
Инго Каркат
источник
7

У меня аналогичная проблема (многие параметры по умолчанию для команд Git глупы). Вот мой подход. Создайте на своем пути скрипт с именем 'grit' (или что-то еще), как показано ниже:

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

Очень просто читать и поддерживать, если вам нужно поделиться им с неспециалистами по Bash.

Стив Беннетт
источник
Вы действительно хотите, чтобы "git remote blah" вызывал "git branch blah"? Я использую вариант этого, когда я помещаю git раньше в путь, а затем явно вызываю / usr / bin / git в моем скрипте. Да, это наверное что-то ломает.
LovesTha
1
Мне это понравилось, и я сделал две дополнительные настройки. Я сделал это функцией Баша , и пусть он будет называться git, добавив первую строку , чтобы получить реальный путь команды: thegit=`/usr/bin/which git`. И я добавил возможность отменить переопределения с й перед командой , как git x log ...: if [ "$cmd" = "x" ]; then; $thegit $@.
Джошуа Голдберг
0

Каждая используемая нами утилита (svn, maven, git, ...) всегда инкапсулирована в .bat (в Windows или .sh в Unix), чтобы предложить нашим разработчикам один каталог для добавления к их пути.

Если git инкапсулирован в сценарий-оболочку, то ... возможно все.

Но это остается решением, связанным с настройкой пользователя, не связанным с самим Git или репозиторием git.

VonC
источник
Значит, вы имеете в виду, что я смогу добиться этого, добавив псевдоним к моему .bash_profile?
Джеспер Рённ-Йенсен,
@Jesper: это идея, поскольку ваша оболочка git.bat сможет определить, какую команду Git вы хотите выполнить, и может добавить любую опцию, которую пожелает.
VonC