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