如何更改Git日志日期格式

我试图在Git中显示最后一次提交,但我需要特殊格式的日期。

我知道日志漂亮格式%ad尊重--date格式,但我能找到的唯一--date格式是“短”。我想知道其他的,以及我是否可以创建一个自定义的,如:

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"
158670 次浏览

其他的是(from git help log):

--date=(relative|local|default|iso|rfc|short|raw)
Only takes effect for dates shown in human-readable format,
such as when using "--pretty".  log.date config variable
sets a default value for log command’s --date option.


--date=relative shows dates relative to the current time, e.g. "2 hours ago".


--date=local shows timestamps in user’s local timezone.


--date=iso (or --date=iso8601) shows timestamps in ISO 8601 format.


--date=rfc (or --date=rfc2822) shows timestamps in RFC 2822 format,
often found in E-mail messages.


--date=short shows only date but not time, in YYYY-MM-DD format.


--date=raw shows the date in the internal raw git format %s %z format.


--date=default shows timestamps in the original timezone
(either committer’s or author’s).

据我所知,没有内置的方法来创建自定义格式,但您可以使用一些shell魔法。

timestamp=`git log -n1 --format="%at"`
my_date=`perl -e "print scalar localtime ($timestamp)"`
git log -n1 --pretty=format:"Blah-blah $my_date"

这里的第一步为您提供一个毫秒时间戳。您可以随心所欲地更改第二行以格式化时间戳。这个例子给你一些类似--date=local的东西,有一个填充的一天。


如果你想要永久的效果,而不是每次都输入这个,试试吧

git config log.date iso

或者,影响你所有的git使用此帐户

git config --global log.date iso
git log -n1 --format="Last committed item in this release was by %an, `git log -n1 --format=%at | awk '{print strftime("%y%m%d%H%M",$1)}'`, message: %s (%h) [%d]"

在花了很长时间寻找一种方法来让git logYYYY-MM-DD的格式输出日期,并以一种可以在less中工作的方式输出日期之后,我想出了以下格式:

%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08

以及开关--date=iso

这将以ISO格式(长格式)打印日期,然后打印14倍的退格字符(0x08),在我的终端中,这将有效地删除YYYY-MM-DD部分之后的所有内容。例如:

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'

这将给出如下内容:

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...

我所做的是创建一个别名l,并对上面的格式进行了一些调整。它在左边显示提交图,然后是提交的散列,然后是日期、短名、引用名和主题。别名如下(在~/.gitconfig中):

[alias]
l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(red)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s'

你可以使用字段截断选项来避免这么多%x08字符。例如:

git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'

等价于:

git log --pretty='format:%h %s%n\t%ci%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08, %an <%ae>'

而且对眼睛也比较好看。

更好的是,对于这个特殊的例子,使用%cd将尊重--date=<format>,所以如果你想要YYYY-MM-DD,你可以这样做,并完全避免%<%x08:

git log --date=short --pretty='format:%h %s%n\t%cd, %an <%ae>'

我只是注意到这篇文章相对于最初的帖子有点循环,但我还是把它留着,以防其他人带着和我一样的搜索参数来到这里。

date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

请注意,这将转换为您的本地时区,以防这对您的用例很重要。

注意"date=iso"格式:它不是完全 ISO 8601 参见commit "466年fb67" from Beat Bolli (bbolli), for Git 2.2.0(2014年11月)

pretty:提供严格的ISO 8601日期格式

Git的“ISO”日期格式并没有真正符合ISO 8601标准,因为差异很小,它不能被ISO 8601专用解析器解析,例如XML工具链的解析器。

"--date=iso"的输出在以下方面偏离ISO 8601:

  • 空格代替T日期/时间分隔符
  • 时间和时区之间的空格
  • 时区的小时和分钟之间没有冒号

添加严格的ISO 8601日期格式,用于显示提交者和作者的日期 使用'%aI'和'%cI'格式说明符,并添加'--date=iso-strict'或'--date=iso8601-strict'日期格式名称

参见这个线程进行讨论。

格式选项%ai是我想要的:

%ai:作者日期,类似ISO 8601的格式

--format="%ai"

使用Bash和date命令将类似iso的格式转换为您想要的格式。我想要一个org-mode日期格式(和列表项),所以我这样做:

echo + [$(date -d "$(git log --pretty=format:%ai -1)" +"%Y-%m-%d %a %H:%M")] \
$(git log --pretty=format:"%h %s" --abbrev=12 -1)

结果是,例如:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Git 2.7 (Q4 2015)将引入-local作为指令 这意味着,除了:

.
--date=(relative|local|default|iso|iso-strict|rfc|short|raw)

你还会有:

--date=(default-local|iso-local|iso-strict-local|rfc-local|short-local)

-local后缀不能与rawrelative一起使用。Reference. "

你现在可以请求任何日期格式使用本地时区。 看到< / p >

参见提交add00ba提交547年ed71 (03 Sep 2015) by 杰夫·金(peff) (由Junio C Hamano—gitster in 提交7 b09c45合并,05 Oct 2015)

特别地,上面的最后一个(commit add00ba)提到:

date:使"local"与日期格式正交:

我们大多数的"--date"模式都是关于日期的格式:我们以什么顺序显示哪些项 但是"--date=local"有点奇怪。它的意思是“以正常格式显示日期,但使用本地时区” 我们使用的时区与实际格式是正交的,没有理由我们不能“本地化iso8601”,等等 这个补丁在"struct date_mode"中添加了一个"local"布尔字段,并从date_mode_type枚举中删除DATE_LOCAL元素(现在它只是DATE_NORMAL加上local=1) 用户可以通过将"-local"添加到任何日期模式(例如,"iso-local")来访问新功能,并且我们保留"local"作为"default-local"的别名以向后兼容

除了--date=(relative|local|default|iso|iso-strict|rfc|short|raw),正如其他人所提到的,你还可以使用自定义日志日期格式

--date=format:'%Y-%m-%d %H:%M:%S'       # committer's timezone
--date=format-local:'%Y-%m-%d %H:%M:%S' # current user's timezone

这将输出类似2016-01-13 11:32:13的内容。

注意:如果你看一下下面链接的提交,我相信你至少需要Git v2.6.0-rc0才能工作。

在一个完整的命令中,它可能是这样的:

git config --global alias.lg "log --graph --decorate -30 --all --topo-order --date=format-local:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'"

我在任何地方都找不到这个文档(如果有人知道在哪里找到它,请评论),所以我最初是通过反复试验找到占位符的。

在我搜索这方面的文档时,我发现提交到Git本身表明该格式直接提供给strftime。查找strftime (在这里在这里)占位符,我发现匹配列出的占位符。

占位符包括:

%a      Abbreviated weekday name
%A      Full weekday name
%b      Abbreviated month name
%B      Full month name
%c      Date and time representation appropriate for locale
%d      Day of month as decimal number (01 – 31)
%H      Hour in 24-hour format (00 – 23)
%I      Hour in 12-hour format (01 – 12)
%j      Day of year as decimal number (001 – 366)
%m      Month as decimal number (01 – 12)
%M      Minute as decimal number (00 – 59)
%p      Current locale's A.M./P.M. indicator for 12-hour clock
%S      Second as decimal number (00 – 59)
%U      Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w      Weekday as decimal number (0 – 6; Sunday is 0)
%W      Week of year as decimal number, with Monday as first day of week (00 – 53)
%x      Date representation for current locale
%X      Time representation for current locale
%y      Year without century, as decimal number (00 – 99)
%Y      Year with century, as decimal number
%z, %Z  Either the time-zone name or time zone abbreviation, depending on registry settings
%%      Percent sign

我也需要同样的东西,并发现以下方法对我有用:

git log -n1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'

--date=format格式化日期输出,其中--pretty告诉打印什么。

我需要特殊格式的日期。

在Git 2.21(2019年第一季度)中,新的日期格式“--date=human"根据时间距离所引入的当前时间的距离改变其输出

--date=auto"可用于在输出到寻呼机或终端时使用此新格式,否则为默认格式。

参见斯蒂芬·p·史密斯(“”)提交110年a6a1提交b841d4f(2019年1月29日)和提交038年a878提交2 fd7c22(2019年1月21日)。
参见Linus Torvalds (torvalds)提交acdd377 (18 Jan 2019)。
(由Junio C Hamano—gitster in 提交ecbe1be合并,07 Feb 2019)

添加“人工”日期格式文档

显示日期和时间信息的格式类似于人们在其他上下文中如何书写日期。
如果当时没有指定年份,则读取器推断给出的日期是当前年份 . < / p > < p > 通过不显示冗余信息,读者将注意力集中在不同的信息上
根据执行git命令时运行的机器上的日期推断出的信息,补丁报告相对日期 虽然这种格式通过删除推断的信息对人类更有用,但没有什么能使它真正成为人类。
如果'relative'日期格式尚未实现,则使用'relative'是合适的

添加human日期格式测试。

当使用human时,根据参考日期和本地计算机日期之间的时间差,几个字段被抑制。

  • 在差异小于一年的情况下,年份字段将被抑制。
  • 如果时间小于一天;月和年是 李抑制。< / >
check_date_format_human 18000       "5 hours ago"       #  5 hours ago
check_date_format_human 432000      "Tue Aug 25 19:20"  #  5 days ago
check_date_format_human 1728000     "Mon Aug 10 19:20"  #  3 weeks ago
check_date_format_human 13000000    "Thu Apr 2 08:13"   #  5 months ago
check_date_format_human 31449600    "Aug 31 2008"       # 12 months ago
check_date_format_human 37500000    "Jun 22 2008"       #  1 year, 2 months ago
check_date_format_human 55188000    "Dec 1 2007"        #  1 year, 9 months ago
check_date_format_human 630000000   "Sep 13 1989"       # 20 years ago

将提议的'auto'模式替换为'auto:'

除了添加'human'格式之外,该补丁还添加了auto关键字,该关键字可以在配置文件中使用,作为指定人工格式的另一种方式。删除'auto'将清理'human'格式接口。

增加了在使用auto:foo语法使用寻呼机时指定模式'foo'的能力。
因此,如果我们使用寻呼机,'auto:human'日期模式默认为human
所以你可以这样做:

git config --add log.date auto:human

和你的"git log"命令将显示人类可读的格式,除非


Git 2.24(2019年Q4)简化了代码。

参见提交47 b27c9提交29 f4332 (12 Sep 2019) by 斯蒂芬·p·史密斯(“”)
(由Junio C Hamano—gitster提交36 d2fca中合并,07 Oct 2019)

停止传递'now'到日期代码

Commit b841d4f (Add human format to test-tool, 2019-01-28, Git v2.21.0-rc0)增加了一个get_time()函数,允许环境中的$GIT_TEST_DATE_NOW覆盖当前时间。
因此,我们不再需要在cmd__date()中解释该变量 因此,我们可以停止传递"now"参数通过 日期函数,因为没有人使用它们。
注意,我们确实需要确保所有之前的调用者都接受了“now"

.参数是正确使用get_time()

在Git 2.32 (Q2 2021)中,“__abc4”(man)占位符学习了%ah/%ch占位符来请求--date=human输出。

参见提交b722d45 (25 Apr 2021) by 胡振宁(adlternative)
(由Junio C Hamano—gitster提交f16a466中合并,2021年5月7日)

pretty:提供人工日期格式

签署人:胡振宁

添加占位符%ah%ch来格式化作者日期和提交者日期,就像--date=human那样,这提供了更人性化的日期输出。

pretty-formats现在在它的手册页中包含:

` %ah `::作者日期,人类风格(类似于的--date=human选项 git rev-list) < / p >

pretty-formats现在在它的手册页中包含:

` %ch `::提交日期,人类风格(如--date=human选项 git rev-list) < / p >