Как мне найти дату коммита git, используя только сантехнические команды? - PullRequest
0 голосов
/ 08 октября 2018

Уже существует вопрос , спрашивающий, как найти дату коммита в Git.Однако все ответы на этот вопрос используют команды git show или git log, которые обе являются фарфоровыми командами ;стандартная мудрость для фарфоровых команд, по-видимому, заключается в том, что их формат вывода может измениться , и поэтому следует избегать их использования в сценариях, где это возможно.

Существует ли способ получить временную меткуgit commit используя только сантехнические команды?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Формат объекта фиксации следующий:

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.

0 голосов
/ 08 октября 2018

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

В этом случае соответствующая команда (отредактировано, 21 марта 2019 г., за комментарий от Джоша ):

git -c log.showSignature=false 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 ...)

0 голосов
/ 08 октября 2018

git cat-file -p HASH_OF_COMMIT вернет содержимое BLOB-объекта коммита.Таким образом, у вас будет доступ ко всем метаданным, а также к дате создания и автора.

...