【问题标题】:git ls-files sort by modification timegit ls-files 按修改时间排序
【发布时间】:2013-10-22 03:26:07
【问题描述】:

如何列出按修改时间排序的文件?

我想要的是 git 修改时间,而不是系统修改时间。例如,如果我有一个(提交的)文件README,那么

touch README

将改变系统修改时间...但git状态将保持不变。

如果我尝试

git ls-files -z | xargs -0 ls  -t

这将按系统修改时间排序。

git ls-files 是否有任何选项可以列出按 git 修改时间排序的文件?

【问题讨论】:

    标签: git sorting


    【解决方案1】:

    git ls-files 是否有任何选项可以列出按 他们的 git 修改时间?

    我不这么认为。一种可能的方法是遍历文件,使用git log 获取时间戳,并使用sort 输出。

    以下可能对您有用:

    while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n
    

    【讨论】:

      【解决方案2】:

      可能是最简单最快的

      git diff-index      --name-only --diff-filter=A @
      git log --pretty='' --name-only | awk '!seen[$0]++'
      

      git diff-index ...首先列出所有新跟踪的文件,然后git log ...首先列出历史上最近被触摸的所有文件(| awk ...删除重复文件)。它仍会列出在当前结帐中已删除的历史文件,但似乎不值得将这些复杂性剔除。

      【讨论】:

      • git log --pretty='' --name-only | awk '!seen[$0]++' 绝对是最快的,但不幸的是它缺少修改时间戳的非常有用的上下文。
      • @ijoseph git log --first-parent --pretty=%cd --name-status | awk 'NF==1{date=$1}NF&gt;1 &amp;&amp; !seen[$2]++{print date,$0}' FS=$'\t'
      • 你是巫师吗?太棒了。
      • @ijoseph nahhh,这是面包和黄油的东西。
      【解决方案3】:

      我可以使用以下命令对文件夹中的文件进行排序

      git ls-files -z -- "${dir}" | xargs -0 -n1 -I{} -- git log -1 --format="%at {}" {} | sort | tail -n1 | cut -d " " -f2-
      

      【讨论】:

      • 我需要按创建时间排序,所以这样修改,我认为它有效:git ls-files -z -- "${dir}" | xargs -0 -n1 -I{} -- sh -c 'git log -1 --format="%at {}" {} | tail -1' | sort | cut -d " " -f2-
      • 在 Mac 上运行该命令,我得到 fatal: empty string is not a valid pathspec. please use . instead if you meant to match all paths
      【解决方案4】:

      最佳答案是Mikko Rantalainenserverfault

      git ls-tree -r --name-only HEAD -z | TZ=UTC xargs -0n1 -I_ git --no-pager log -1 --date=iso-local --format="%ad _" -- _ | sort 
      

      【讨论】:

      • 这是最好的,因为它 (a) 显示人类可读的时间戳,不像上面 devnull 的答案,并且 (b) 显示一般的时间戳,而且不仅仅是最近的,不像 datinc ' s 和 thill 的答案在上面。
      【解决方案5】:

      这不会显示所有文件,但它可以让您快速了解您查找的顺序发生了什么变化:

      git log --name-only
      

      【讨论】:

        猜你喜欢
        • 2017-07-26
        • 2016-08-13
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 2020-08-06
        • 2019-11-09
        • 2021-06-19
        • 2014-11-12
        相关资源
        最近更新 更多