Git log табличное форматирование

У меня есть простой псевдоним, чтобы отображать несколько последних коммитов:

log --pretty=format:'%h %an %s' -10

Как я могу сделать результаты отображаемыми в столбцах, например:

898e8789 Author1             Commit message here
803e8759 Other Author name   Commit message here

Ответ 1

В Git 1.8.3 и более поздних версиях для этого есть встроенная поддержка в симпатичном формате, используя синтаксис %<(N) для форматируйте следующий заполнитель как N колонок:

$ git log --pretty=format:'%h %<(20)%an %s' -10

Для версий до версии 1.8.3 предыдущая версия этого ответа, сохраненная ниже, должна работать.

Здесь решение в Bash с использованием read для разбора строк журнала, и printf, чтобы распечатать их, с полем фиксированной ширины для имени авторов, чтобы столбцы оставались выровненными. Предполагается, что | никогда не появится в имени автора; вы можете выбрать другой разделитель, если считаете, что это может быть проблемой.

git log --pretty=format:'%h|%an|%s' -10 | 
  while IFS='|' read hash author message
  do 
    printf '%s %-20s %s\n' "$hash" "$author" "$message"
  done

Вы можете создать это как псевдоним, используя:

[alias]
    mylog = "!git log --pretty=format:'%h|%an|%s' -10 | while IFS='|' read hash author message; do printf '%s %-20s %s\n' \"$hash\" \"$author\" \"$message\"; done"

Я уверен, что вы могли бы сделать это за меньшее количество символов, используя awk, но как говорится о,

Когда сталкиваются с проблемой, некоторые люди говорят: "Давайте использовать AWK". Теперь у них есть две проблемы.

Конечно, сказав это, мне пришлось выяснить, как это сделать в awk, который немного короче:

git ... | awk -F '|' '{ printf "%s %-20s %s\n", $1, $2, $3 }'

Ответ 2

Вы также можете сделать:

git log --pretty=format:'%h %<(20)%an %s' -10

Нет необходимости в магии оболочки или последующей обработке с помощью awk, column и т.д.

Ответ 3

Следующая команда будет печатать журнал в виде таблицы

git log --pretty=format:'%h|%an|%s' -10 | column -t -s '|'

column команда "columnates" выводит результат, используя "|" как разделитель полей, он будет определять оптимальную ширину столбца при вводе, поэтому он будет работать хорошо, даже если у вас больше полей.

В Linux он будет работать нормально, пока вы не используете цвета, реализация Linux не справляется с кодами escape-кода ANSI.

Но в Mac OS X он будет обрабатывать цвета, и вы можете использовать любой символ Юникода в качестве разделителя полей. Я использую Σ, так как я уверен, что это не произойдет случайно в тексте фиксации. | - плохой выбор, потому что он может отображаться в описании фиксации, а также если вы используете --graph --decorate --all, он будет отображаться как часть символов, используемых для рисования графика

Ответ 4

Чтобы получить по-настоящему табличный формат, вам также нужно усечь имена пользователей длиной, например, не более 20 символов:

git log --pretty=format:'%h %<(20,trunc)%an %s' -10

Кроме того, если вы выводите данные на терминал, вы можете предотвратить переполнение строки, обрезав поле сообщения фиксации:

git log --pretty=format:'%h %<(20,trunc)%an %<(39,trunc)%s' -10

или оборачивая строки и делая отступы для выравнивания:

git log --pretty=format:'%w(79, 0, 29)%h %<(20,trunc)%an %s' -10

РЕДАКТИРОВАТЬ: приведенный выше пример жестко кодирует ширину терминала, чтобы быть 79 символов. В системах POSIX вы можете использовать tput cols для возврата ширины:

git log --pretty=format:'%w('tput cols', 0, 29)%h %<(20,trunc)%an %s' -10

или же

git log --pretty=format:'%w($(('tput cols'-1)), 0, 29)%h %<(20,trunc)%an %s' -10

К сожалению, эти два последних git alias нарушают git alias поэтому для него потребуется терминальный псевдоним (если вы действительно не любите печатать).

Ответ 5

Проблема с табличным форматом заключается в том, что вам может не хватить места...

Следующее - мой личный лучший компромисс между необходимыми вещами для отображения:

  • кто
  • сделал что
  • и когда
  • чтобы иметь возможность копать больше хешем коммитов для того, how

так:

  git log --pretty --format='%h %aI %<(15)%an ::: %s'

или же

 git log --pretty --format='%h %cI %<(15)%an ::: %s'

если вы хотите получить время коммитера, а не время автора