Як змінити формати дати журналу 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]"

1
Я завжди вважаю, що офіційна документація Linux Kernel Git є прекрасним ресурсом для таких питань.

2
Примітка: у вас зараз (листопад 2014, Git 2.2) є --date=iso-strict: дивіться мою відповідь нижче
VonC

4
Завдяки git 2.7 (Q4 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

15
І якщо ви хочете отримати постійний ефект, не вводячи це кожен раз, спробуйте щось подібне git config log.date isoабо, щоб вплинути на все ваше використання git з цим рахункомgit config --global log.date iso
Stéphane Gourichon

12
Ви можете використовувати власні формати. дивіться відповідь Бен Елред . --format:<args>перейде <args>до стрімкінгу.
Людина капітана

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 на windows. Ось моя версія git. 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>'

Я щойно помітив, що це було трохи круговим щодо оригіналу публікації, але я залишу його у випадку, якщо сюди приїхали інші з тими ж параметрами пошуку, що і я.


23

Мені потрібно було те саме, і я виявив, що працює для мене:

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

--date=formatФорматує висновок дати , коли --prettyговорить , що друкувати.


2
Це не працює для мене. Я отримую "невідомий формат дати"
Рей

яка версія git у вас є?
lac_dev


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 " від Beat Bolli ( 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" дати.

Дивіться цю тему для обговорення.


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

Зауважте, що це перетвориться на ваш місцевий часовий пояс, якщо це має значення для вашого випадку використання.


Дякую. Я переробив його%% ct
cagney

5

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 вересня 2015 р.) Від Джеффа Кінга ( peff) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 7b09c45 , 05 жовтня 2015 р.)

Зокрема, останній зверху (виконувати add00ba) згадує:

date: зробити " local" ортогональний формат дати:

Більшість наших " --date" режимів стосується формату дати: які елементи ми відображаємо та в якому порядку.
Але " --date=local" це трохи дивна куля. Це означає "показати дату у звичайному форматі, але використовуючи локальний часовий пояс".
Часовий пояс, який ми використовуємо, є ортогональним для фактичного формату, і немає причин, щоб ми не могли мати "локалізований iso8601" тощо.

Цей патч додає " local" булеве поле до " struct date_mode" і скидає DATE_LOCALелемент із date_mode_typeenum (тепер це просто DATE_NORMALплюс local=1).
Нова функція доступна для користувачів, додавши " -local" в будь-який режим дати (наприклад, " iso-local"), і ми збережемо " local" псевдонім для " default-local" для зворотної сумісності.


2
Мушу зазначити, що і format-localтвори! Тож дуже ідеально зливаються сили між улюбленим форматом та локальним.
вступник

5

Варіант форматування %aiбув таким, що я хотів:

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

--format="%ai"

5

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

У Git 2.21 (1 квартал 2019 р.) Новий формат дати " --date=human", який перетворює результат, залежно від того, наскільки введено час від поточного часу .

" --date=auto" може бути використаний для використання цього нового формату, коли вихід збирається в пейджер або в термінал, інакше формат за замовчуванням.

Див. Команду 110a6a1 , фіксує b841d4f (29 січня 2019 року) та виконує 038a878 , виконує 2fd7c22 (21 січня 2019 року) Стівена П. Сміта (``) .
Див. Комісію acdd377 (18 січня 2019) Лінуса Торвальдса ( torvalds) .
(Об'єднав Хуніо С Хамано - gitster- в комітеті ecbe1be , 07 лютого 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 р.) Стівена П. Сміта (``) .
(Об'єднав Хуніо С Хамано - gitster- у коміт 36d2fca , 07 жовтня 2019 р.)

Покиньте передавати "зараз" коду дати

Фіксація b841d4f (Додати humanформат для тест-інструменту, 2019-01-28, Гіт v2.21.0-RC0) додали get_time()функцію , яка дозволяє $GIT_TEST_DATE_NOWв навколишньому середовищі , щоб перевизначити поточний час.
Тому нам більше не потрібно інтерпретувати цю змінну в cmd__date().

Тому ми можемо зупинити передачу параметра " now" вниз через функції дати, оскільки ніхто їх не використовує.
Зауважте, що нам потрібно переконатися, що всі попередні абоненти, які прийняли " now" параметр, правильно використовують get_time().


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-подібного формату у потрібний. Я хотів формат дати в органічному режимі (і пункт списку), тому я зробив це:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.