繁体   English   中英

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

[英]How to get the last commit date for a bunch of files in Git?

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

这样做的上下文是,我正在使用其他 Bash 命令来查找与某些条件匹配的一长串文件,我想将此列表通过管道传输到 Git 命令中以获取每个文件的最后提交日期。

以下命令会有所帮助:

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

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

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

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

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

我在 shell 脚本方面很垃圾,所以我不确定如何通过管道构造该命令,但也许这会是另一个问题的好话题。

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

结果按时间降序排列。

这是一个使用 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。

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

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

笔记:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM