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

150

Я пытаюсь отобразить последний коммит в 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]"
ar3
источник
1
Я всегда нахожу официальную документацию по Linux Kernel Git отличным ресурсом для подобных вопросов.
2
Примечание: у вас сейчас (ноябрь 2014 г., Git 2.2) есть --date=iso-strict: см. Мой ответ ниже
VonC
4
С git 2.7 (4 квартал 2015 года) вы можете попросить использовать местный часовой пояс для любого формата даты! Смотрите мой ответ ниже . Это означает, что, кроме того --date=(relative|local|default|iso|iso-strict|rfc|short|raw), у вас также будет:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Ответы:

167

Другие (из 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
dmedvinsky
источник
15
И если вы хотите получить постоянный эффект, не вводя его каждый раз, попробуйте что-то вроде git config log.date isoили, чтобы повлиять на все использование Git с этой учетной записьюgit config --global log.date iso
Стефан Гурихон
12
Вы можете использовать свои собственные форматы. см . ответ Бена Оллреда . --format:<args>перейдет <args>в strftime.
Капитан Мэн
190

В дополнение к тому --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'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
%%      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'" 
Бен Оллред
источник
4
@Shiva: Я недавно столкнулся с делом, которое не сработало, и это может быть то же самое, что вы столкнулись. Я использовал сопряжение со старой версией Git. Когда я обновил 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'"
Бен Оллред
1
Спасибо Бен! Я вставил вашу команду как есть и запустил, git lgи я все еще получаю следующую ошибку. fatal: unknown date format format:%Y-%m-%d %H:%M:%S, Я бегу мерзавец на окнах. Вот моя мерзавская версия. git version 1.9.5.msysgit.1, Так нужно ли мне обновляться до более новой версии?
Шива
Привет Бен, я был на старой версии. Я обновился до последней версии, и это работает. Поэтому я отредактировал ваш ответ, чтобы сделать его более понятным (переместил ваш комментарий вверх), а также добавил +1 к вам! Спасибо!!
Шива
Это работает удовольствие! Используя простой bash-скрипт для экспорта в csv, теперь у меня есть столбцы для года, месяца, недели и т. Д. Обожаю.
Джейми Тейлор
1
@EdRandall: Если вы имеете в виду %X, ~~ Я только что попробовал это на своей машине и определенно получил время в моем часовом поясе. ~~ Хм, теперь я не уверен. Я клонировал репо от кого-то не в моем часовом поясе и попытался снова. Я думаю, что я просто получаю время, отформатированное с использованием текущих настроек локали, но с отключенным часовым поясом.
Бен Оллред
36

После долгих поисков способа 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'
Бруно Рейс
источник
2
Это работает очень хорошо для меня. Использование 6 из% x08 удаляет точно завершающий часовой пояс для меня.
Penghe Geng
7
Как насчет--date=short shows only date but not time, in YYYY-MM-DD format.
Пааске
3
В zsh и bash это показывает, что вы выводите данные на терминале, но если вы перенаправите их во что-либо, данные «backspaced» все еще там. Это означает, что такие вещи | sort | uniqне работают.
Chmac
5
Это смешно и потрясающе одновременно. Я использую, %C(bold cyan)%ai%x08%x08%x08%x08%x08%x08%x08%x08%x08%C(reset) %C(bold green)(%ar%x08%x08%x08%x08)%C(reset)чтобы получить формат 2015-01-19 11:27 (11 days). +1
naught101
2
теперь этот ответ stackoverflow.com/a/34778736/907576 больше подходит (начиная с Git v2.6.0-rc0)
radistao
25

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

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

dvhart
источник
23

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

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

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

lac_dev
источник
2
Это не работает для меня. Я получаю «неизвестный формат даты»
Рэй
какая версия Git у вас есть?
lac_dev
Обновлено с помощью medium.com/@katopz/how-to-upgrade-git-ff00ea12be18
бариста-любитель
git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
любительская бариста
@amateurbarista, который не показывает последний коммит, прочитайте запрос. ar3 пытается показать последний коммит, а не несколько последних коммитов.
lac_dev
16

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

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

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

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

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

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

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

VonC
источник
11
date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

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

гепард
источник
Спасибо. Я настроил его с% ct
cagney
5

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. Ссылка .

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

Смотрите коммит add00ba , коммит 547ed71 (03 сентября 2015 г.) Джеффа Кинга ( 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» для обратной совместимости.

VonC
источник
2
Должен отметить, что format-localтоже работает! Так что это очень прекрасно, что объединить власть между любимым форматом и местным.
Активист
5

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

%ai: дата автора, формат ISO 8601

--format="%ai"
ThorSummoner
источник
5

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

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

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

См. Коммит 110a6a1 , коммит b841d4f (29 января 2019 г.) и коммит 038a878 , коммит 2fd7c22 (21 января 2019 г.) Стивена П. Смита (``) .
Смотрите коммит acdd377 (18 января 2019) Линуса Торвальдса ( torvalds) .
(Слиты Junio C Hamano - gitster- в фиксации ecbe1be , 7 февраля 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 г.) Стивена П. Смита (``) .
(Слиты Junio C Hamano - gitster- в фиксации 36d2fca , 07 окт 2019)

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

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

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

VonC
источник
2
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]"
Уэбб
источник
Хотите разработать? Кроме того, ваш ответ уже имеет поле автора и историю. нет необходимости подписывать его.
Киссаки
2

Используйте 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
Liam
источник