如何在Git中获取一堆文件的最后提交日期?

时间:2011-12-23 01:51:34

标签: git

什么是最简单的单行程序来获取Git存储库中一堆文件的最后一次提交日期(即,对于每个文件,最后一次提交更改该文件的日期)?

这个的上下文是我使用其他Bash命令来查找符合某些条件的长文件列表,并且我想将此列表管道化为Git命令以获取最后一次提交每个文件的日期。

5 个答案:

答案 0 :(得分:66)

以下命令将有所帮助:

git log -1 --format=%cd filename.txt

这将打印一个文件的最新更改日期。 -1显示一个日志条目(最新),--format=%cd显示提交日期。有关选项的完整说明,请参阅git-log的文档。

您应该能够轻松地为一组文件扩展它。

答案 1 :(得分:7)

稍微扩展Greg的答案,git log可以在其参数中采用多条路径。然后它将仅显示包含这些路径的提交。因此,要获取一组文件的最新提交:

git log -1 --format=%cd -- fileA.txt fileB.txt fileC.txt

我对shell脚本非常垃圾,所以我不确定如何通过管道构建该命令,但也许这对于另一个问题来说是个好主题。

答案 2 :(得分:3)

这里是一个使用find的单线程(为了便于阅读而分成几个,但由于尾部反斜杠,复制粘贴应该有效):

find <dirs...> -name '<pattern>' <any other predicate to get what you want> \
  -exec git log -1 --format="AAA%ai NNN" '{}' \; \
  -exec echo '{}' XXX \; \
| tr \\n N | sed -e 's/AAA/\n/g' | sed -e 's/NNNN/ /g' -e 's/XXX.*//g'

使用tr和sed过度复杂的换行符只是在一行上获取日期和文件名,并忽略未跟踪的文件。您必须确保没有任何文件包含那些愚蠢的标记AAA XXX NNNN。

答案 3 :(得分:1)

使用git ls-files查找git文件,然后使用git log格式化输出。但是由于git log在共享相同的提交时间时会将多个文件分组在一起,因此我更喜欢让它一次处理一个文件,然后对结果进行排序。

产生的一线:

for f in $(git ls-files); do git --no-pager log --color -1 --date=short --pretty=format:'%C(cyan)%ai%Creset' -- $f ; echo  " $f"; done |sort -r

如果要将其添加到您的.bashrc中:

function gls() {
    for f in $(git ls-files); do git --no-pager log --color -1 --date=short --pretty=format:'%C(cyan)%ai%Creset' -- $f ; echo  " $f"; done |sort -r
}

然后运行gls将输出如下内容:

2019-09-30 11:42:40 -0400 a.c
2019-08-20 11:59:56 -0400 b.conf
2019-08-19 16:18:00 -0400 c.c
2019-08-19 16:17:51 -0400 d.pc

结果按时间降序排列。

答案 4 :(得分:0)

要使用git(对于任何文件)以长(Unix纪元时间戳)格式获取最后提交日期,请使用以下命令。

  • 命令: git log -1 --format=%ct filename.txt
  • 结果: 1605094689

注意:

  1. 您可以在git项目中指定任何文件以及扩展名。
  2. 您可以访问git-log文档以获取有关选项的更详细说明。