我同意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
文档中找到这样描述pretty format
%cd
的方法:
%cd: 提交者日期(格式遵循--date=选项)
如果我们没有给出
--date=
选项,那么
git log
会查找
log.date
设置。这是一个用户配置选项,我们的
git log
输出将取决于
用户的选择,而不是我们的选择。
要使这个
git log
像一个plumbing命令一样工作,我们必须使用
--date=default
或
-c log.date=default
来覆盖
log.date
配置设置。
git -c log.date=default log --no-walk --pretty=format:%cd
或者:
git log --no-walk --date=default --pretty=format:%cd
理想情况下,Git 应该有一个被定义为 git log 的管道变量的 plog 命令,或者一个 git format-log-metadata 管道命令,它接受 --pretty= 选项并格式化日志元数据。由于没有这个命令,所以任何需要 git log --pretty=format:... 输出的脚本编写者都需要确保他们知道可能会影响他们的配置选项。
git log
以面向机器的格式出现在第2.3章,它是“本书的前九章”之一。 - Geno Chen