Отличается ли индекс каталога от индекса файла в файловых системах типа ext -?

Вы пытаетесь поместить сценарий оболочки в параметр форматирования Git. Конечно, это не сработает. 1

  • Есть некоторые параметры Git, которые на самом деле принимают сценарии оболочки, например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-последовательностями)


Сноски

  • 1 На самом деле, из-за отсутствия кавычек, вашif [ ! %an = "my own user name" ]...уже выполнялся бы в строке USER=(%anбудет сравниваться буквально — в шелле это не имеет особого значения )] ; сделать это эффективно USER="%C(cyan)<%an>"еще до того, как вы успели вызвать команду git log.
  • 2 Кроме того, вы сказали, что хотели бы выделить свое имя голубым цветом, а другие — синим жирным шрифтом; но ваш исходный код на самом деле попытался выполнить обратное :, если (имя автора)не является(моим собственным именем пользователя ), выделите голубым цветом, иначе выделите жирным синим цветом . Я придерживаюсь вашего описания.
  • 3\xявляется расширением GNU sed , ваш пробег может отличаться, если вы используете это в системе, отличной от -GNU.

0
25.11.2020, 11:08
1 ответ

Принципиально они одинаковы, см.:

Отличаются только блоки данных. Я бы порекомендовал вам загрузить достаточно старую версию ядра Linux (, например. 2.0)и изучите исходный код файловой системы ext2, который даст вам полное понимание.

0
18.03.2021, 22:47

Теги

Похожие вопросы