【问题标题】:List files in order of last modification date按最后修改日期的顺序列出文件
【发布时间】:2014-04-28 20:01:21
【问题描述】:

我的回购逾期未清理。我认为一个好的起点是按照最后一次触摸的顺序列出所有文件,并从最旧的开始。有没有办法做到这一点?

【问题讨论】:

  • 您的意思是列出 repo 中实际修改的所有(本地)文件,还是列出通过签入修改文件的顺序?即,您是真的要求执行 git 操作,还是只想执行 shell/文件系统操作?

标签: git


【解决方案1】:

没有办法(我知道)使用标准的 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 开头的行时,它会中断。

【讨论】:

    【解决方案2】:

    提交级别的信息应该足以回答 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 " "
    

    其他组合也是可能的。

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

    【讨论】:

    • 这太棒了。感谢分享和拯救我的一天:-)
    【解决方案3】:

    4b825dc642cb6eb9a060e54bf8d69288fbee4904 is the empty-tree commit in git.

    使用 --name-only 你可以得到文件名,通过漂亮的打印什么,你得到提交信息的空行。通过管道进入 awk NF,您可以过滤空行。通过管道进入 tac,顺序是相反的。

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

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 2016-01-20
      • 2014-05-14
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多