列出当前git分支中任意点的子目录中的文件';历史

列出当前git分支中任意点的子目录中的文件';历史,git,Git,要在特定提交时列出子目录中存在的所有文件,我可以签出该提交并查看这些文件。有没有一种方法可以列出在任何时候(即在当前提交的祖先中的任何提交中)存在于子目录中的所有文件?是:git ls tree接受所谓的“tree ish”和可选路径(如果未指定,则默认为存储库根目录) 树ish是任何可以解析为树的东西,一个在记录的提交中存储关于单个“目录”的信息的对象 提交总是精确地引用单个树对象,树对象可能引用零个或多个表示“子目录”的其他树对象 因此,提交始终是一个vaid“树” TL;DR 要获取/fo

要在特定提交时列出子目录中存在的所有文件,我可以签出该提交并查看这些文件。有没有一种方法可以列出在任何时候(即在当前提交的祖先中的任何提交中)存在于子目录中的所有文件?

是:
git ls tree
接受所谓的“tree ish”和可选路径(如果未指定,则默认为存储库根目录)

树ish是任何可以解析为树的东西,一个在记录的提交中存储关于单个“目录”的信息的对象

提交总是精确地引用单个树对象,树对象可能引用零个或多个表示“子目录”的其他树对象

因此,提交始终是一个vaid“树”

TL;DR

要获取
/foo/bar
前缀下的文件列表,请执行三次提交回拨

git ls-tree HEAD~2 foo/bar

更新了,以反映对原始问题的澄清


但是我想要所有提交中的文件,即HEAD,HEAD~,HEAD~2,HEAD~3,HEAD~4,…回顾整个历史。也许我的问题不清楚

您可以使用一些shell脚本:

git rev list HEAD |读取sha时;做
git ls tree-r“$sha”前缀/感兴趣;
完成
…它基本上遍历DAG中所有可从
头访问的提交,
对于它们中的每一个,调用带有提交名称和感兴趣的前缀(目录名)的
gitls-tree

请注意,如果前缀的树对象在特定提交中不存在,
git ls tree
将以非零退出代码退出,因此如果要在
set-e
下运行此代码,则应确认并补偿此代码

这种方法可以通过多种有趣的方式进行升级。
例如,您可能不只是获取文件列表或调用类似于“
git show--name status$sha”
等的内容。

爱奥尼亚•比兹•u的另一个问题(“如何使用git日志仅获取具有路径的文件名?”)为我提供了一些解决方法。这似乎可以获得所有提交到当前状态的
/foo/bar
目录下曾经存在的所有文件:

git日志--名称状态--/foo/bar | grep-E'^[A-Z]\b'| sed-E's/^\w\t*\*/'| sort | uniq
  • git log--name status
    提供在所有提交()中更改的所有文件的名称和状态
  • -/foo/bar
    将日志限制在感兴趣的目录()
  • |
    bash管道()
  • grep-E'^[A-Z]\b'
    获取以(
    ^
    )大写字母(
    [A-Z]
    )开头的行,后跟分词(
    \b
    ),即以M、D、A等开头的行。。。。(&)
  • sed-e的/^\w\t*\*/'
    s/regexp/replacement/
    上运行流编辑器。在这种情况下,
    ^\w\t***
    查找以一个单词(
    \w
    )开头的行,后跟零个或多个制表符(
    \t*
    ),然后是零个或多个空格(
    \*
    )并将这些匹配项替换为空字符串()
  • 排序
    ()
  • uniq
    ()

(注意:此解决方案不包括添加到工作树或阶段但尚未提交的文件,因此请先添加并提交。)

如果在
头2中删除了文件,该怎么办?
git ls tree
是否会显示此文件在分支的历史记录中的某个点存在?但我希望所有提交中的文件,即HEAD,HEAD~,HEAD~2,HEAD~3,HEAD~4,…都可以追溯到整个历史记录。也许我的问题不清楚?@邓布利多,是的,对我来说不清楚:我把“在任何一点上”解释为“在我选择的任何一点上”,而不是“在他们存在的所有点上”,对不起。@Code学徒,不,不会。要获取存在于中的给定路径名的提交列表,可以使用
git rev list
(管道级别命令)或
git log——即/path/name
@code peedient,使用解决方案更新我的答案。