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

时间:2014-04-28 20:01:21

标签: git

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

3 个答案:

答案 0 :(得分: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

此方法只能将添加的内容注册到文件中,而不是从文件中删除的内容。此外,当存储库中的行以author-time开头时,它会中断。

答案 1 :(得分:1)

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

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

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

一个人可能想限制当前在其当前目录中检出的文件:

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

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

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

其他组合也是可能的。

对于带有空格和其他字符的文件,所有这些方法都应该起作用。

答案 2 :(得分:0)

4b825dc642cb6eb9a060e54bf8d69288fbee4904 is the empty-tree commit in git.

使用--name-only选项,您可以获取文件名,通过不打印任何内容,您可以获得提交信息的空行。通过管道连接到awk NF,可以过滤空行。通过管道输送到tac中,顺序相反。

git log --pretty="format:" --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904..HEAD | awk NF | tac