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

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

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

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

Ответ 1

Остальные (от 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, с добавленным днем.


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

git config log.date iso 

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

git config --global log.date iso

Ответ 2

В дополнение к --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 config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

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

В моем поиске документации по этому вопросу я обнаружил коммит для самого 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 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
%%      Percent sign

В полной команде это будет что-то вроде

git config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

Ответ 3

После долгого поиска способа получить 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 раз символ обратного пространства (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'

Ответ 4

Вы можете использовать опцию усечения поля, чтобы избежать довольно многих символов %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>'

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

Ответ 5

Мне нужно было то же самое и я нашел следующее:

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

--date=format формат вывода даты, где --pretty сообщает, что печатать.

Ответ 6

Обратите внимание на формат "date=iso": это не совсем ISO 8601.
Смотрите 466fb67 из Beat Bolli (bbolli), для Git 2.2. 0 (ноябрь 2014 года)

pretty: укажите строгий формат даты ISO 8601

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

Выход из "--date=iso" отличается от ISO 8601 следующими способами:

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

Добавьте строгий формат даты ISO 8601 для отображения даты коммиттера и автора.
Используйте спецификаторы формата '%aI и' %cI 'и добавьте имена формата даты <<26 > или <<27 > .

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

Ответ 7

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

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

Ответ 8

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

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

--format="%ai"

Ответ 9

Git 2.7 (четвертый квартал 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. Ссылка.

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

См. commit add00ba, commit 547ed71 (03 сентября 2015) от Джефф Кинг (peff).
(Merged by Junio C Hamano -- [TG48] -- in commit 7b09c45, 05 Oct 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" для обратной совместимости.

Ответ 10

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",$1)}'`, message: %s (%h) [%d]"

Ответ 11

  Мне нужна дата в специальном формате.

В Git 2.21 (Q1 2019) введен новый формат даты "--date=human", который изменяет свой вывод в зависимости от того, насколько далеко время от текущего времени,.

"--date=auto" можно использовать для использования этого нового формата, когда вывод идет на пейджер или на терминал и в другом формате по умолчанию.

Смотрите коммит 110a6a1, коммит b841d4f (29 января 2019 г.) и коммит 038a878, коммит 2fd7c22 (21 января 2019 г.) от Стивен П. Смит ('').
См. коммит acdd377 (18 января 2019 г.) автора Линуса Торвальдса (torvalds).
(Merged by Junio C Hamano -- [TG43] -- in commit ecbe1be, 07 Feb 2019)

Добавить документацию в формате человеческой даты

Отображение информации о дате и времени в формате, аналогичном тому, как люди пишут даты в других контекстах.
Если год не указан, читатель делает вывод, что указана дата в текущем году.

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

Хотя этот формат более полезен для людей, так как отбрасывает выведенную информацию, ничто не делает его на самом деле человеком.
Если формат даты "relative" еще не реализован, то было бы целесообразно использовать "relative".

Добавьте human тесты формата даты.

При использовании human несколько полей подавляются в зависимости от разницы во времени между исходной датой и датой локального компьютера.

  • В тех случаях, когда разница меньше года, поле года подавляется.
  • Если время меньше суток; месяц и год подавлено.
check_date_format_human 18000       "5 hours ago"       #  5 hours ago
check_date_format_human 432000      "Tue Aug 25 19:20"  #  5 days ago
check_date_format_human 1728000     "Mon Aug 10 19:20"  #  3 weeks ago
check_date_format_human 13000000    "Thu Apr 2 08:13"   #  5 months ago
check_date_format_human 31449600    "Aug 31 2008"       # 12 months ago
check_date_format_human 37500000    "Jun 22 2008"       #  1 year, 2 months ago
check_date_format_human 55188000    "Dec 1 2007"        #  1 year, 9 months ago
check_date_format_human 630000000   "Sep 13 1989"       # 20 years ago

## Заменить предложенный режим "auto" на "auto:"

В дополнение к добавлению формата human, патч добавил ключевое слово auto, которое можно использовать в файле конфигурации в качестве альтернативного способа указания человеческого формата. Удаление "auto" очищает интерфейс формата "human".

Добавлена возможность указывать режим "foo", если пейджер используется с использованием синтаксиса auto:foo.
Поэтому в режиме даты auto:human по умолчанию используется human, если мы используем пейджер.
Так что вы можете сделать:

git config --add log.date auto:human

и ваши команды "git log" покажут удобочитаемый формат, если только вы пишете сценарии.


Git 2.24 (Q4 2019) упростил код.

Смотрите коммит 47b27c9, коммит 29f4332 (12 сентября 2019 г.) от Стивена П. Смита ('').
(Merged by Junio C Hamano -- [TG421] -- in commit 36d2fca, 07 Oct 2019)

Прекратите передавать код "сейчас" на дату

Зафиксировать b841d4f (добавить формат human в test-tool, 2019-01-28, Git v2.21.0-rc0) добавил функцию get_time(), которая позволяет $GIT_TEST_DATE_NOW в среде переопределять текущий время.
Поэтому нам больше не нужно интерпретировать эту переменную в cmd__date().

Поэтому мы можем прекратить передачу параметра "now" через функции даты, так как никто не использует их.
Обратите внимание, что нам нужно убедиться, что все предыдущие вызывающие абоненты, которые принимали параметр "now", правильно использовали get_time().

Ответ 12

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

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