列出当前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,使用解决方案更新我的答案。