Как мне найти дату коммита 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).

Так что в основном для достижения того, чего вы хотите, вы:

  1. Вызов git cat-file commit <commitish_of_interest>
  2. Переберите то, что эта программа выгружает в свою stdoutот LFлинии
  3. Остановитесь на линии, которая начинается с author SP,
  4. Разделите его на пробелы и возьмите последние два поля. Первый - это количество секунд с 00:00 в часовом поясе, определенном вторым полем, которое имеет форматSHHMM где S это знак, - или же +где определяется смещение, если к западу или к востоку от Гринвича, соответственно, и HHMM это смещение, в HH часы и MM минут, часового пояса.
  5. Обработайте значения этих двух полей для форматирования метки времени.

Обратите внимание, что содержимое 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...)

Другие вопросы по тегам