Как изменить форматы даты журнала Git

Я пытаюсь отобразить последнюю фиксацию в Git, но мне нужна дата в специальном формате.

Я знаю, что журнал довольно-формате %ad уважение , но только --date формат, который я могу найти, "короткий". Я хочу знать другие, и могу ли я создать пользовательский, такой как:

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"

11 ответов


остальные (с git help log):

--date=(relative|local|default|iso|rfc|short|raw)
  Only takes effect for dates shown in human-readable format,
  such as when using "--pretty".  log.date config variable
  sets a default value for log command’s --date option.

--date=relative shows dates relative to the current time, e.g. "2 hours ago".

--date=local shows timestamps in user’s local timezone.

--date=iso (or --date=iso8601) shows timestamps in ISO 8601 format.

--date=rfc (or --date=rfc2822) shows timestamps in RFC 2822 format,
  often found in E-mail messages.

--date=short shows only date but not time, in YYYY-MM-DD format.

--date=raw shows the date in the internal raw git format %s %z format.

--date=default shows timestamps in the original timezone
  (either committer’s or author’s).

нет встроенного способа, который я знаю, чтобы создать пользовательский формат, но вы можете сделать некоторую магию оболочки.

timestamp=`git log -n1 --format="%at"`
my_date=`perl -e "print scalar localtime ($timestamp)"`
git log -n1 --pretty=format:"Blah-blah $my_date"

первый шаг здесь получает вас меткой времени. Вы можете изменить вторую строку для форматирования этой метки времени, как вы хотите. Этот пример дает вам что-то похожее на --date=local, С мягким днем.


и если вы хотите постоянный эффект, не вводя каждый раз, попробуй!--7-->

git config log.date iso 

или, для влияния на все ваше использование git с этой учетной записью

git config --global log.date iso

кроме --date=(relative|local|default|iso|iso-strict|rfc|short|raw), Как уже упоминалось, вы также можете использовать пользовательский формат даты журнала с

--date=format:'%Y-%m-%d %H:%M:%S'

выводит что-то вроде 2016-01-13 11:32:13.

Примечание: если вы посмотрите на фиксацию, связанную с Ниже, я считаю, что вам понадобится по крайней мере Git v2.6.0-rc0 для этого, чтобы работать.

Я не смог найти это в документации нигде (если кто-то знает, где его найти, прокомментируйте), поэтому я изначально нашел заполнители методом проб и ошибок.

в моем поиске документации по этому я нашел обязательство самому Git это означает, что формат подается непосредственно в strftime. Глядя вверх strftime (здесь или здесь) местозаполнители я нашел матч перечисленных заполнителей. Заполнители включают

%a        Abbreviated weekday name
%A        Full weekday name
%b        Abbreviated month name
%B        Full month name
%c        Date and time representation appropriate for locale
%d        Day of month as decimal number (01 – 31)
%H        Hour in 24-hour format (00 – 23)
%I        Hour in 12-hour format (01 – 12)
%j        Day of year as decimal number (001 – 366)
%m        Month as decimal number (01 – 12)
%M        Minute as decimal number (00 – 59)
%p        Current locale's A.M./P.M. indicator for 12-hour clock
%S        Second as decimal number (00 – 59)
%U        Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w        Weekday as decimal number (0 – 6; Sunday is 0)
%W        Week of year as decimal number, with Monday as first day of week (00 – 53)
%x        Date representation for current locale
%X        Time representation for current locale
%y        Year without century, as decimal number (00 – 99)
%Y        Year with century, as decimal number
%z, %Z        Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
%%        Percent sign

после долгого времени ищет способ получить git log вывод даты в формате YYYY-MM-DD таким образом, что будет работать в less, Я придумал следующий формат:

%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08

вместе с переключателем --date=iso.

это напечатает дату в формате ISO (длинный), а затем напечатает 14 раз символ backspace (0x08), который в моем терминале эффективно удаляет все После части YYYY-MM-DD. Например:

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'

это дает что-то вроде:

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...

то, что я сделал, это создать псевдоним с именем l С некоторыми изменениями в формате выше. Он показывает график фиксации слева, затем хэш фиксации, за которым следуют дата, короткие имена, имена и тема. Псевдоним выглядит следующим образом (в~/.gitconfig хранит настройки):

[alias]
        l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(red)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s'

вы можете использовать опцию усечения поля, чтобы избежать так много %x08 символы. Например:

git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'

эквивалентно:

git log --pretty='format:%h %s%n\t%ci%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08, %an <%ae>'

и совсем немного легче на глазах.

еще лучше, для этого конкретного примера, используя %cd честь --date=<format>, так что если вы хотите YYYY-MM-DD, вы можете сделать это и избежать %< и %x08 полностью:

git log --date=short --pretty='format:%h %s%n\t%cd, %an <%ae>'

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


быть в курсе "date=iso" формат: это не ровно ISO 8601.
Фиксации " 466fb67" из Бить Болли (bbolli), для Git 2.2.0 (ноябрь 2014)

довольно: обеспечить строгий формат даты ISO 8601

формат даты " ISO " Git на самом деле не соответствует стандарту ISO 8601 из-за небольших различий, и он не может быть проанализирован только синтаксическими анализаторами ISO 8601, например XML наборы инструментов.

выход из "--date=iso " отклоняется от ISO 8601 следующим образом:

  • пробел вместо T дата и время-разделитель
  • пространство между временем и часовым поясом
  • нет двоеточия между часами и минутами часового пояса

добавьте строгий формат даты ISO 8601 для отображения дат коммиттера и автора.
Используйте '%aI' и '%cI 'спецификаторы формата и добавить'--date=iso-strict' или '--date=iso8601-strict' формат даты, имена.

посмотреть этой теме для обсуждения.


мне нужно было то же самое, и я обнаружил, что для меня работает следующее:

git log -n 1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'

на --date=format форматирует вывод даты, где --pretty говорит, что печатать.


date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

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


формат %ai было то, что я хотел:

%ai: дата автора, ISO 8601-подобный формат

--format="%ai"

Git 2.7 (Q4 2015) представит -local как инструкция.
Это означает, что, в дополнение к:

--date=(relative|local|default|iso|iso-strict|rfc|short|raw)

у вас также будет:

--date=(default-local|iso-local|iso-strict-local|rfc-local|short-local)

на -local суффикс нельзя использовать с raw или relative. ссылка.

теперь вы можете запросить любой формат даты использование местного часового пояса. См.

посмотреть совершить add00ba, совершить 547ed71 (03 Sep 2015) by Джефф Кинг (peff).
(слитый Junio C Hamano -- gitster -- на совершить 7b09c45, 05 окт 2015)

в частности, последний сверху (commit add00ba) упоминает:

date: сделать "local" ортогональный на сегодняшний день формат:

большинство наших "--date" режимы - это формат даты: какие элементы мы показываем и в каком порядке.
Но"--date=local " это немного странно. Это означает "показать дату в обычном формате, но с использованием локального часового пояса".
Часовой пояс, который мы используем, ортогональен фактическому формату, и нет причин, по которым мы не могли бы иметь "локализованный iso8601" и т. д.

этот патч добавит "local" логическое поле "struct date_mode", и падает DATE_LOCAL элемент date_mode_type перечисление (это теперь просто DATE_NORMAL плюс local=1).
Новая функция доступна пользователям, добавив "-local " в любой режим даты (например,"iso-local"), и мы сохраняем "local "как псевдоним для"default-local" для обратной совместимости.


git log -n1 --format="Last committed item in this release was by %an, `git log -n1 --format=%at | awk '{print strftime("%y%m%d%H%M",)}'`, message: %s (%h) [%d]"

используйте Bash и команду date для преобразования из ISO-подобного формата в тот, который вы хотите. Я хотел org-mode формат даты (и элемент списка), поэтому я сделал это:

echo + [$(date -d "$(git log --pretty=format:%ai -1)" +"%Y-%m-%d %a %H:%M")] \
    $(git log --pretty=format:"%h %s" --abbrev=12 -1)

и результат, например:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631