Как мне найти дату коммита git, используя только сантехнические команды?
Уже есть вопрос о том, как найти дату коммита в Git. Тем не менее, все ответы на этот вопрос используют git show
или же git log
команды, которые являются фарфоровыми командами; стандартная мудрость в отношении фарфоровых команд, по-видимому, заключается в том, что их выходной формат может измениться и поэтому следует избегать их использования в сценариях, где это возможно.
Есть ли способ получить временную метку git коммита, используя только сантехнические команды?
3 ответа
Формат объекта коммитов следующий:
tree SP SHA_1_NAME_AS_HEX LF
parent SP SHA_1_NAME_AS_HEX LF
...
author SP any number of words SP <email_addr> SP TIMESTAMP SP TZ_OFFSET LF
committer SP any number of words SP <email_addr> SP TIMESTAMP SP TZ_OFFSET LF
LF
commit message LF
LF
extensive commit message
(Куда SP
является пробелом ASCII, 0x20, и LF
является символом перевода строки ASCII, 0x0a).
Так что в основном для достижения того, чего вы хотите, вы:
- Вызов
git cat-file commit <commitish_of_interest>
- Переберите то, что эта программа выгружает в свою
stdout
отLF
линии - Остановитесь на линии, которая начинается с
author SP
, - Разделите его на пробелы и возьмите последние два поля. Первый - это количество секунд с
00:00
в часовом поясе, определенном вторым полем, которое имеет форматSHHMM
гдеS
это знак,-
или же+
где определяется смещение, если к западу или к востоку от Гринвича, соответственно, иHHMM
это смещение, вHH
часы иMM
минут, часового пояса. - Обработайте значения этих двух полей для форматирования метки времени.
Обратите внимание, что содержимое author
а также committer
поля одинаковы только при "нормальных" фиксациях. При повторной фиксации, по крайней мере, временные метки могут отличаться, и если коммит был перебазирован лицом, отличным от того, кто фактически создал коммит (его автора), поля будут другими. То же самое относится и к коммитам, созданным из патчей через git am
,
git cat-file -p HASH_OF_COMMIT
вернет содержимое коммита blob. Таким образом, вы будете иметь доступ ко всем метаданным, а также к авторам и датам создания.
Git немного слаб в правильном различении сантехники и фарфора. Совет использовать в сценариях сантехнические команды хорош, но иногда такая команда, как git log
- не имеет подходящего варианта сантехники, но есть варианты, которые делают его "отвесным", если я могу составить слово.
В этом случае подходящая команда:
git log --pretty=format:%ad --no-walk <hash>
(или то же самое с %cd
в качестве директивы формата даты коммиттера; добавить различные параметры форматирования даты, чтобы git log
сам или как %aD
например, чтобы изменить формат даты). Ничто не обещает, что git log
может не добавлять новые функции, такие как log.decorate
установка, которая может нарушить это, и Git должен получить с собой и добавить --porcelain
варианты команд, которые ведут себя как git status
делает. (Обратите внимание, что git status
сейчас имеет --porcelain
а также --porcelain=v2
, оба из которых преобразуют его в сантехнику. Не спрашивайте меня, почему это не пишется --plumbing
...)