Цвет в git-log

106

Когда вы запустите git log --decorate --pretty=onelineна выходе будут записи, как (HEAD, refs/published/master, master)с окраской.

В моем gitconfig также есть следующее:

[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green

Как воспроизвести эти цвета при создании пользовательского формата, подобного следующему?

git log --decorate --stat --graph --pretty=format:"%d %Cgreen%h%Creset (%ar - %Cred%an%Creset), %s%n"
NorthIsUp
источник

Ответы:

91

Начиная с git 1.8.3 (24 мая 2013 г.), вы можете использовать %C(auto)для украшения %dв строке формата git log.

Из примечаний к выпуску :

 * "git log --format" specifier learned %C(auto) token that tells Git
   to use color when interpolating %d (decoration), %h (short commit
   object name), etc. for terminal output.)
Элад Шахар
источник
60

По git log --decorateумолчанию будет помещено:

  • ГОЛОВА в голубом
  • удаленные филиалы в красном
  • тег в зеленом

и может быть изменен через color.decorateconfig.

Но git log --formatони не предлагают способ конкретно отображать HEAD или пульты или ветвь: все три отображаются %dс одним возможным цветом.


Обновление мая 2013 как указано ниже по Elad Шахар (upvoted), мерзавец 1.8.3 предлагает больше один вариант:

git log –formatтеперь содержит %C(auto)токен, который сообщает Git использовать цвет при разрешении %d(оформлении), %h(короткое имя объекта фиксации) и т.д. для вывода терминала.

В этом сообщении в блоге Atlassian говорится, что эта функция является частью нескольких других, ориентированных на формат ( git rebase, git count-objects) и цвета ( git branch -vv)

Это дополнение к предыдущей версии auto,reset1.8.2 , которая автоматически отключает цвета, когда вывод не используется для терминала1.

%C(auto,blue)Hello%C(auto,reset)

Примечание: git 2.4+ (второй квартал 2015 г.) лучше справляется с сбросом цвета вокруг имен веток.
См. Коммит 5ee8758 от Junio ​​C Hamano ( gitster) :

log --decorate: не пропускайте цвет "фиксации" в следующий элемент

В " git log --decorate" вы увидите такой заголовок фиксации:

commit ... (HEAD, jc/decorate-leaky-separator-color)

где " commit ... (" закрашивается color.diff.commit, " HEAD" in color.decorate.head, " ," in color.diff.commit, имя ветки в color.decorate.branchи затем закрывается " )" в color.diff.commit.

Если вы хотите закрасить HEAD и имя локальной ветки в тот же цвет, что и основной текст (возможно, потому, что голубой и зеленый слишком тусклые на черно-белом терминале, чтобы их можно было прочитать), вам не нужно говорить

[color "decorate"]
    head = black
    branch = black

потому что вы не сможете повторно использовать ту же конфигурацию на терминале «белое на черном». Вы наивно ожидали

[color "decorate"]
    head = normal
branch = normal

работать, но, к сожалению, это не так.
Он закрашивает строку « HEAD» и имя ветки в тот же цвет, что и открывающая скобка или запятая между элементами декора.
Это потому, что код забывает сбросить цвет после печати «префикса» в его собственном цвете.


Обратите внимание, что в git 2.5 (второй квартал 2015 г.) исправлена ​​ошибка:

См. Коммит 429ad20 от Junio ​​C Hamano ( gitster) , 13 мая 2015 г.
(объединено Junio ​​C Hamano - gitster- в commit fd70780 , 22 мая 2015 г.)

log: не сокращайте названия украшений слишком рано

log --decorateУсовершенствование " " в Git 2.4, которое показывает фиксацию в конце текущей ветки, например " HEAD -> master", не работало с --decorate = full.


Git 2.9.x + (3 квартал 2016 г.) исправит еще одну ошибку и сделает честь color=autoдля%C(auto)


Git 2.10.2 (октябрь 2016 г.) исправляет другие ошибки с помощью фиксации 82b83da (29 сентября 2016 г.) и фиксации c99ad27 (17 сентября 2016 г.) Рене Шарфе (``) .
(Объединено Junio ​​C Hamano - gitster- в коммите 76796d4 , 28 октября 2016 г.)

pretty: избегать добавления сброса, %C(auto)если вывод пуст

Мы создаем escape-последовательность для сброса цвета и атрибута, %C(auto)чтобы убедиться, что автоматическая окраска отображается должным образом.
Прекратите делать это, если выходной strbuf пуст , то есть когда %C(auto)появляется в начале строки формата, потому что тогда нет необходимости в сбросе, и мы сохраняем несколько байтов на выходе.

pretty: %C(auto)сбросить все атрибуты

Сбросить цвета и атрибуты , %C(auto)чтобы включить полный автоматический контроль над ними; в противном случае такие атрибуты, как полужирный или обратный, могут по-прежнему действовать от предыдущих %Cзаполнителей .

VonC
источник
3
нет возможности использовать --decorate и --pretty = "... stuff"?
NorthIsUp
8
@NorthlsUp: --decorateпохоже, имеет свою собственную реализацию и конфигурацию, но --prettyпредлагает ту же информацию через %dодин блок, что означает, что вы не можете иметь такой же мелкозернистый уровень конфигурации цвета, --prettyкак у вас --decorate.
VonC
Единственное различие, которое я вижу, когда добавляю «--decorate» после «git log», - это репозитории, начинающиеся с «refs / Heads / ...» или «refs / remotes ...». Цвета проявляются в любом случае. Есть идеи, что может вызвать это? Я спрашиваю, потому что мой .gitconfig не показывает никаких свойств цвета. Мне интересно, где я могу найти свою собственность "color.decorate". Я не вижу его в моем файле .gitconfig.
J Woodchuck
@JWoodchuck Попробуйте git config --show-origin -l: вы увидите все свои конфиги. Затем вы можете ввести "цвет" с помощью grep.
VonC
Да, ничего не отображается, когда я ищу цвет, из-за чего настройки выглядят так загадочно.
J Woodchuck
9

Поместите их в скобки:

%C(...): color specification, as described in color.branch.* config option

Так %C(yellow reverse)бы сработало.

Джош Ли
источник
1
не совсем так, %dэто все ветви, чтобы это могло выглядеть (HEAD, master), в этом случае голова должна быть синей, а мастер должен быть зеленым (я считаю, что это цвета по умолчанию). где %C(yellow)%d%Cresetбы сделать это все одного цвета.
NorthIsUp
2
О, раскраска отдельных украшений. Я думаю это невозможно. Код для отображения записей журнала по существу реализован дважды.
Джош Ли
1
Жаль, что это невозможно ... Я бы с удовольствием сделалgit log --decorate --oneline --date=...
mgalgs
8

Параметр конфигурации log.decorateможет включать / отключать декорации по умолчанию в журналах.

git config --global log.decorate full

Как только это будет сделано, вы можете color.decorate.*играть с цветами.

Хенрик Густафссон
источник
3
log.decorate=fullзаставляет печатать имена ссылок с их префиксами ( refs/heads/и т. д.); Я считаю log.decorate=shortболее полезным.
musiphil
1
Очень полезная настройка, хотя я тоже предпочитаю short, чемfull
Thomas Levesque
4

Некоторые могут захотеть использовать это: %C(colorname) это не требует изменения конфигурации цвета.

Пример: выделение имени автора желтым цветом

--pretty=format:"%C(yellow)%an%Creset"

Обычные цвета ANSI должны работать https://en.wikipedia.org/wiki/ANSI_escape_code

  • черный
  • красный
  • зеленый
  • желтый
  • синий
  • пурпурный
  • голубой
  • белый
NullPointerWizard
источник