如何更改Git日志日期格式

如何更改Git日志日期格式,git,command-line,Git,Command Line,我试图在Git中显示最后一次提交,但我需要特殊格式的日期 我知道log pretty格式%ad尊重--date格式,但我能找到的唯一--date格式是“short”。我想知道其他的,以及我是否可以创建一个自定义的,例如: git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]" 其他的是(来自git帮

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

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

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"
其他的是(来自git帮助日志):

据我所知,没有内置的方式来创建自定义格式,但您可以使用一些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日志的方法后,我想出了以下格式:

%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'
git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'
+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
这会产生如下结果:

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...
git config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 
我所做的是创建了一个名为
l
的别名,并对上述格式进行了一些调整。它在左侧显示提交图,然后是提交的哈希,然后是日期、短名称、引用名称和主题。别名如下所示(在~/.gitconfig中):


您可以使用字段截断选项来避免太多的
%x08
字符。例如:

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'
git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'
+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631

我只是注意到,这是一个有点循环相对于原来的职位,但我会离开它,以防其他人来到这里与我一样的搜索参数

date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M
请注意,这将转换为您的本地时区,以防对您的用例产生影响。

请注意“
date=iso
”格式:它并不准确。
有关Git 2.2.0(2014年11月),请参见提交自

漂亮:提供严格的ISO8601日期格式 Git的“ISO”日期格式与ISO 8601标准的差异很小,因此不能真正符合ISO 8601标准,并且只能由ISO 8601解析器解析,例如XML工具链的解析器

--date=iso
”的输出在以下方面与iso 8601不同:

  • 一个空格,而不是
    T
    日期/时间分隔符
  • 时间和时区之间的空间
  • 时区的小时和分钟之间没有冒号
添加严格的ISO 8601日期格式以显示提交人和作者日期。
使用“
%aI
”和“
%cI
”格式说明符并添加“
--date=iso strict
”或“
--date=iso8601 strict
”日期格式名称


有关讨论,请参阅。

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

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


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

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

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'
git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'
+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Git 2.7(2015年第4季度)将引入
-local
作为说明。
这意味着,除了:

--date=(relative|local|default|iso|iso-strict|rfc|short|raw)
您还将拥有:

--date=(default-local|iso-local|iso-strict-local|rfc-local|short-local)
-local
后缀不能与
raw
relative
一起使用

现在,您可以使用本地时区请求任何日期格式。 看

  • ,
  • ,
  • ,
  • ,
  • ,
  • ,
  • ,
  • ,
  • (2015年9月3日)由
参见(2015年9月3日)作者。
(于2015年10月5日合并)

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

日期
:使“
本地
”与日期格式正交: 我们的大多数“
--date
”模式都与日期的格式有关:显示哪些项目以及显示顺序。
但是“
--date=local
”有点古怪。它的意思是“以正常格式显示日期,但使用本地时区”。
我们使用的时区与实际格式是正交的,我们没有理由不能使用“本地化iso8601”等

此修补程序将一个“
local
”布尔字段添加到“
struct date\u mode
”,并从
date\u mode\u type
枚举中删除
date\u local
元素(现在只是
date\u NORMAL
加上
local=1
)。
用户可以通过将“
-local
”添加到任何日期模式(例如“
iso-local
”)来访问新功能,我们保留“
local
”作为“
默认本地
”的别名,以实现向后兼容性

除了
--date=(相对|本地|默认| iso | iso严格| rfc |短|原始)
,如其他人所述,您还可以使用自定义日志日期格式

--date=format:'%Y-%m-%d %H:%M:%S'
这输出类似于
2016-01-13 11:32:13

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

在完整命令中,它将类似于:

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...
git config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 
我一直无法在任何地方的文档中找到它(如果有人知道在哪里可以找到它,请发表评论),所以我最初是通过反复试验找到占位符的

在我搜索这方面的文档时,我发现这表明格式直接输入到strftime。查找strftime(或)我找到的占位符与列出的占位符匹配

占位符包括:

%a缩写的工作日名称
%工作日全名
%缩写月份名称
%B全名
%c适合于区域设置的日期和时间表示法
%d以十进制数字表示的月份日期(01–31)
%24小时中的小时
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
git config --add log.date auto:human