Вы пытаетесь поместить сценарий оболочки в параметр форматирования Git. Конечно, это не сработает. 1
git filter-branch
; но они будут явно указаны как таковые на соответствующей странице руководства. То, что вы пытаетесь выполнить, на самом деле может быть выполнено не с помощью Git, а с помощью внешнего фильтра для сопоставления имен и пометки их цветами с помощью escape-последовательностей ANSI .
Например, если имя автора совпадает с «Joe Average », выделите имя и угловые скобки голубым цветом; в противном случае выделите имя и угловые скобки жирным синим цветом. 2 Остальные части текста оставьте без изменений в обоих случаях...
Реализовано с использованием Perl 5 в качестве фильтра:
git log "--pretty=tformat:%h <%an> %s" | perl -n -e '
chomp;
if(/^(.*)<([^>]*)>(.*)$/) {
if ($2 eq "Joe Average") {
print $1."\e[36m<".$2.">\e[39m".$3."\n";
} else {
print $1."\e[1m\e[34m<".$2.">\e[39m\e[0m$3\n";
}
} else {
print $_."\n";
}'
Реализовано с использованием sed
в качестве фильтра (немного хакерски 3)...
git log "--pretty=tformat:%h <%an> %s" | sed '
s/<\(Joe Average\)>/\x1B[36m<\1>\x1B[39m/g;
t matched;
s/<\([^>]*\)>/\x1B[1m\x1B[34m<\1>\x1B[39m\x1B[0m/g;
:matched'
Обычный вывод (без фильтра )из тестового репозитория:
$ git log "--pretty=tformat:%h <%an> %s"
e7f3209 improving portability
e3ebe74 adding first working prototype
Выделенный результат (пропущен через любой из фильтров):
Обратите внимание, что эти команды фильтрации по-прежнему будут работать, даже если вы изменили формат вывода git log
, при условии, что:
<
>
. <
>
больше ничего не заключено.Другой способ сделать то, о чем вы просили, — выполнить два разных вызова git log
с разными --author
и --pretty
, объединить результаты и отсортировать их по отметке времени; но сложная часть заключается в том, чтобы убедиться, что выходные данные обоих вызовов git log
не дают перекрывающихся выходных данных. (Вы не можете использовать uniq
, так как это помечает их обоих разными escape-последовательностями)
if [ ! %an = "my own user name" ]...
уже выполнялся бы в строке USER=
(%an
будет сравниваться буквально — в шелле это не имеет особого значения )] ; сделать это эффективно USER="%C(cyan)<%an>"
еще до того, как вы успели вызвать команду git log
. \x
является расширением GNU sed , ваш пробег может отличаться, если вы используете это в системе, отличной от -GNU. Принципиально они одинаковы, см.:
Отличаются только блоки данных. Я бы порекомендовал вам загрузить достаточно старую версию ядра Linux (, например. 2.0)и изучите исходный код файловой системы ext2, который даст вам полное понимание.