Почему канал удаляет имена веток из журнала git? - PullRequest
1 голос
/ 21 июня 2019

когда я бегу

> git log --oneline

Я получаю вывод, похожий на этот

abcdef0 (head, branch, origin/branch) comment
0987654 different comment
1234567 (different-branch, origin/branch) third comment

Но как только я перенаправлю вывод во что-либо (например, > git log --oneline | cat), имена ветвей исчезнут

abcdef0 comment
0987654 different comment
1234567 third comment

Это означает, что я не могу использовать grep, добавлять номера строк или что-то в этом роде.

(в нем также отсутствуют цвета и стиль поведения less, но сегодня мне плевать на это)

Это то, что я могу включить через параметр командной строки?

Ответы [ 2 ]

4 голосов
/ 21 июня 2019

Команда git log - это то, что Git называет фарфор . Это означает, что он предназначен для использования настоящими людьми, в отличие от других команд Git, таких как git rev-parse и git for-each-ref, которые в основном или полностью предназначены для компьютерных программ. бежать.

Фарфоровые команды обычно настраиваются и часто выполняют такие вещи, как цвет или разбивают на страницы свой вывод. Это верно и для git log. Несколько элементов управления для этого являются git config записи:

color.ui = auto
log.decorate = auto

Эта автоматическая настройка, которая является настройкой по умолчанию - вы можете изменить ее на always или never - говорит Git: Когда команда записывает свой вывод в терминал, сделайте это, но когда это не так (например, когда он пишет в канал, как в git branch | grep ...), не делайте этого.

Опция log.decorate управляет украшениями (master). Цвет конкретного текста и, если да, то какими цветами управляет довольно сложный лабиринт опций, который просто начинается с color.ui.

Установка color.ui в always нарушит наивные сценарии, которые запускают фарфоровые команды в конвейерах, и ожидает, что для color.ui будет установлено значение по умолчанию auto. Ни один из собственных скриптов Git не является наивным, как этот, но вы можете использовать свои собственные расширения или те, которые получены от людей, которые не думали об этой проблеме, поэтому будьте осторожны при переопределении этих значений по умолчанию.

(Кстати, будьте осторожны с = в настройках. Они необходимы, например, внутри .git/config и git -c color.ui=true log, но запрещены в git config log.decorate auto. Это сумасшедшая путаница исторических артефактов и кодирования любого было целесообразно в то время.)

2 голосов
/ 21 июня 2019

Для начала я тоже заметил отсутствие цветов после конвейера для bash, но то, что вы описываете по поводу исчезновения украшений (имен веток и тегов), странно.Давайте рассмотрим их по отдельности.

Адресация названий ветвей (украшений) самим

--decorate

- это флаг для одноразового использования.

Для постоянного эффекта вы можете установить его в config

log.decorate true

И для более конкретной необходимости, обратите внимание, что вы можете использовать его в красивом формате с заполнителем%d, например:

git log -10 --pretty=format:"%C(yellow)%h %C(reset)%aN %ar %C(red)%d %C(reset)%s"

для результата, который выглядит следующим образом

enter image description here

О цветах

Нет, я не знаю, как / почему он ломается при передаче в bash, я позволю более опытным пользователям ответить на эту часть. (и, как я уже сказал, в личной заметке я очень рад, что вы задали этот вопрос, потому что я тоже хотел бы знать это - Правка: спасибо torek!: -) )

...