我同意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
等等。管道版本忽略所有用户配置,因此您编写的脚本对 Alice、Bob、Carol 和 Dave 的行为相同,即使他们有不同的设置。
当使用这个定义时,我们可以决定git log 是否像一个管道命令。这需要枚举所有git log 配置选项。不幸的是,没有干净的方法可以做到这一点 - 可以随时添加更多选项,并且随着时间的推移添加了一些选项。
这是我通过查阅git log 和git config 手册找到的列表。请注意,我省略了所有面向差异的那些(例如,color.diff 和上面提到的diff.* 项目),因为有管道命令来处理git log 中的-p 等效项(尽管您必须完成一次提交一次)。
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:... 输出,以确保他们知道可能影响他们的配置选项。