Есть "git log --pretty =Фарфоровая или сантехническая команда? - PullRequest
0 голосов
/ 02 декабря 2018

Я создаю некоторые сценарии и программы, которые извлекают информацию о фиксации, используя

git log --pretty=<my format> -1 <commit>

Интересно, подходит ли вывод этой команды для анализа программами (слесарное дело) или предназначен только для представления людям(фарфор).Например, в некоторых проектах я получаю SHA коммит + имя автора + сводка коммитов с этим:

git log --pretty="%H%n%an%n%s" -1 HEAD

И затем я разделяю строку вывода символом новой строки (я в Linux).

Кроме того, в некоторых случаях я также делаю что-то вроде этого:

git log --pretty='[%h] %an: %s' -1 HEAD

И затем анализирую результат с помощью следующего регулярного выражения, ожидая, что короткий SHA, имя автора и сводка коммитов находятся взахваченные группы:

^\[(\w+)\] ([^:]+): (.*)$

Это хороший подход?Если нет, каков предпочтительный способ программно получить информацию о коммитах?

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Я согласен с kostix ;git log - это фарфоровая команда.Но проблема здесь в том, что есть некоторые вещи, которые git log может сделать, которые слишком сложно сделать с другими командами, поэтому мы иногда можем заставить git log вести себя как как сантехническую команду.

Ключевое различие между сантехникой и фарфором проявляется при сравнении, например, git branch и git tag с git for-each-ref или git diff с git diff-tree и git diff-files и git diff-index.Дело не в том, сколько фарфоров на сантехнику.Здесь, например, сантехника git for-each-ref имеет два отдельных фарфоровых передних конца, в то время как один фронтальный конец git diff имеет три сантехнических задних конца.Нет, ключ в том, что git diff меняет свое поведение в зависимости от выбранных пользователем элементов конфигурации:

diff.algorithm
diff.dirstat
diff.renameLimit
diff.renames
diff.statGraphWidth
diff.submodule

и так далее.Версии системы игнорируют все пользовательские настройки , поэтому сценарий, который вы пишете, ведет себя одинаково для Алисы, Боба, Кэрол и Дэйва, даже если они имеют разные настройки.

При использовании этого определениямы можем решить, будет ли git log действовать как сантехническая команда.Для этого необходимо перечислить все параметры конфигурации git log.К сожалению, нет чистого способа сделать это - в любое время можно добавить больше опций, а некоторые были добавлены с течением времени.

Вот список, который я нашел, просматривая руководство git log и git config,Обратите внимание, что я опускаю все diff-ориентированные элементы (например, элементы color.diff и diff.*, упомянутые выше), так как есть сантехнические команды для обработки эквивалента -p в git log (хотя вы должны работать через один коммитза один раз).

color.decorate.<slot>
core.notesRef
format.pretty
i18n.logOutputEncoding
log.abbrevCommit
log.date
log.decorate
log.follow
log.graphColors
log.mailmap
log.showRoot
log.showSignature
notes.displayRef
pretty.<name>

Итак, допустим, мы хотим получить дату коммиттера из какого-то конкретного коммита, отформатированного определенным образом.Для этого мы могли бы выполнить:

git log --no-walk --pretty=format:%cd

В основной документации git log мы находим, что симпатичный формат %cd описывается следующим образом:

% cd: дата принятия(формат уважения --date = опция)

Нам не удалось указать параметр --date=, поэтому git log найдет параметр log.date.Это опция пользовательской конфигурации, и наш git log вывод будет зависеть от выбора пользователя , а не от нашего.

Чтобы этот git log действовал как команда сантехники, то мы должны переопределить настройку конфигурации log.date, например, --date=default или -c log.date=default:

git -c log.date=default log --no-walk --pretty=format:%cd

или:

git log --no-walk --date=default --pretty=format:%cd

В идеале,Git должен иметь либо команду plog, определенную как вариант подключения git log , либо команду git format-log-metadata, которая принимает параметры --pretty=<directives> и форматирует метаданные журнала.Поскольку этого не происходит, каждый, кто пишет сценарий, должен выводить git log --pretty=format:..., чтобы убедиться, что он знает о параметрах конфигурации, которые могут на них повлиять.

0 голосов
/ 22 декабря 2018

Спасибо kostic и torek за их ответы.

Несмотря на то, что они ответили, я считаю, что некоторые опций симпатичного формата можно безопасно рассматривать как слесарное дело (т.е. безопасно анализироватьпо программам).Примеры включают

  • %H для полной фиксации SHA
  • %T для полного дерева SHA
  • %P для полной родительской SHA
  • %an, %cn, %ae, %ce, %at, %ct для имени автора / инициатора / адреса электронной почты / даты (Unix).Кроме того, времена стиля RFC 2822 и ISO 8601 являются надежными %aD, %cD, %aI, %cI
  • %s для сводки фиксации
  • %G? для статуса подписи
  • %n для новой строки (lol ...)

Да, хотя параметры формата, такие как %ad и %cN, могут зависеть от пользовательских настроек, маловероятно, чтовыше те делают.Поэтому я решил, что мой текущий код, который анализирует вывод git log с красивым форматом, объединенным из описанных выше спецификаторов, является безопасным и не подвержен ошибкам.

0 голосов
/ 02 декабря 2018

git log - это фарфоровая команда.

На самом деле она выполняет довольно разнородное количество задач - комбинируя ход по графу ревизий, git diff и git grep и еще много чего.

Aсантехнический способ сделать что-то вроде

git log --pretty='[%h] %an: %s' -1 HEAD

- это объединить git show-ref с git cat-file и проанализировать результат - что-то вроде

git cat-file commit `git show-ref -s HEAD` |
  while read line; do
    # do some processing
  done

На самом деле корневая страница руководства Git, git(1) - запустить git help git, чтобы прочитать его - содержит разбивку команд по слоям фарфора и сантехники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...