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

如何在Git中获取一堆文件的最后提交日期?,git,Git,获取Git存储库中一堆文件的最后提交日期(即,对于每个文件,更改该文件的最后提交日期)最简单的一行代码是什么 这里的上下文是,我正在使用其他Bash命令查找一长串符合某些条件的文件,我只想将此列表导入Git命令,以获取每个文件的最后提交日期。以下命令将非常有用: git log -1 --format=%cd filename.txt 这将打印一个文件的最新更改日期。-1显示一个日志条目(最近的),而--format=%cd显示提交日期。有关选项的完整说明,请参阅文档 您应该能够轻松地对一组文

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


这里的上下文是,我正在使用其他Bash命令查找一长串符合某些条件的文件,我只想将此列表导入Git命令,以获取每个文件的最后提交日期。

以下命令将非常有用:

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


您应该能够轻松地对一组文件进行扩展。

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

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

我在shell脚本编写方面相当差劲,因此我不确定如何通过管道构造该命令,但这可能是另一个问题的一个好主题。

这里有一个使用find的一行代码(为了可读性,将其分成若干行,但由于后面的反斜杠,copy–paste应该可以工作):

查找-名称“”\
-exec git log-1--format=“AAA%ai NNN”{}\\
-exec echo“{}”XXX\\
|tr\\n | sed-e's/AAA/\n/g'| sed-e's/nnnnnn//g'-e's/XXX.//g'

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

使用
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

结果按时间降序排列。

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

  • 命令:
    git日志-1——格式=%ct filename.txt
  • 结果:
    1605094689
注意:

  • 您可以在git项目中指定任何文件以及扩展名
  • 您可以访问文档以获得选项的更详细描述

  • 这很有帮助。是否有更好的方法将每个文件的名称附加到日期,而不是像下面这样:
    for x in$(some命令);do echo$x$(git日志-1--格式=%cd$x);完成了吗?我不这么认为,因为所有的
    %
    格式代码都是指提交而不是单个文件
    echo
    可能是最简单的方法。值得指出的是,
    %ci
    输出ISO(ish)格式的日期;所以你可以把它们分类。另外,
    %ai
    输出的是作者日期,而不是提交人日期。您是否曾经创建过git别名或其他任何文件,以转储一堆文件的提交日期?我有一个包含文件和文件夹/文件等的父文件夹。我想查看上次该文件夹中的任何内容发生更改的时间。@terry
    for I in target/*;DoGit日志-1——格式=%ci$i;done | sort | tail-1
    是的,但这会返回所有文件提交中的最新提交,而不是每个文件的最新提交。这很有效,但遗憾的是在TravisCI环境中不起作用。TravisCI克隆回购时,所有文件日期都是克隆的日期和时间(今天/现在),而不是回购中的日期和时间。非常令人沮丧。如果其他人对此感兴趣,我会在这里向TravisCI记录一个问题>
    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