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'
если вы хотите получить время коммитера, а не время автора