什么是最简单的单行程序来获取Git存储库中一堆文件的最后一次提交日期(即,对于每个文件,最后一次提交更改该文件的日期)?
这个的上下文是我使用其他Bash命令来查找符合某些条件的长文件列表,并且我想将此列表管道化为Git命令以获取最后一次提交每个文件的日期。
答案 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
注意: