按上次修改日期的顺序列出文件

gar*_*ois 3 git

我的回购已经过期清理了.我认为一个好的起点是按照上次触摸的顺序列出所有文件,并从最旧的文件开始.有没有办法实现这个目标?

use*_*575 5

没有办法(我知道)使用标准的git命令来做到这一点.您需要的是git blame整个存储库的某种类型,标识历史记录中最后一次更改每个文件的提交.当然,您可以使用标准git blame,解析瓷器输出以识别最新提交的时间戳,该时间戳将内容添加到文件中,并根据该时间戳对文件进行排序:

#!/bin/bash

function last-modified()
{
    git blame -p "$1" | awk '
        BEGIN {
            print 0;
        }
        $1 == "author-time" {
            print $2;
        }' | sort -n | tail -n 1
}

function list-files()
{
    for file in $(git ls-files); do
        echo "$(last-modified $file) $file"
    done
}

list-files | sort -n
Run Code Online (Sandbox Code Playgroud)

这种方法只能注册添加到文件中的内容,但不能从文件中删除内容.此外,当存储库中有行开头时,它会中断author-time.


Sté*_*hon 5

提交级别的信息应该足以回答 OP 问题,不需要 git-blame 获取的那种细节。

这种方法列出了 git 已知的所有文件以及影响文件的最后一次提交的日期,按该日期排序:

while read FILE
do git log --pretty="%ad $FILE" --date=iso8601-strict -1 -- "$FILE"
done < <( git ls-files ) | sort
Run Code Online (Sandbox Code Playgroud)

人们可能希望限制当前在其当前目录中签出的文件:

while read FILE
do git log --pretty="%ad $FILE" --date=iso8601-strict -1 -- "$FILE"
done < <( find . -type f ) | sort
Run Code Online (Sandbox Code Playgroud)

人们可能只想列出文件,而不显示日期:

while read FILE
do git log --pretty="%ad $FILE" --date=iso8601-strict -1 -- "$FILE"
done < <( git ls-files ) | sort | cut -f 2 -d " "
Run Code Online (Sandbox Code Playgroud)

其他组合也是可能的。

所有这些都应该适用于带有空格和其他字符的文件。