首页 > 解决方案 > 列出当前 git 分支历史记录中任意位置的子目录中的文件

问题描述

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

标签: git

解决方案


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

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

一个提交总是引用一个单一的树对象,一个树对象可能引用零个或多个其他树对象——代表“子目录”。

因此,提交始终是一个空洞的“树状”。

TL;博士

获取前缀下的文件列表/foo/bar三个提交回调调用

git ls-tree HEAD~2 foo/bar

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

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

可以使用一些 shell 脚本来滚动:

git rev-list HEAD | while read sha; do
  git ls-tree -r "$sha" prefix/of/interest;
done

…它基本上遍历 DAG 中可访问的所有提交,并使用提交名称和感兴趣的前缀(目录名称)对HEAD每个提交进行调用。git ls-tree

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

这种方法可能会以许多有趣的方式进行升级。
例如,人们可能不只是获取文件列表或调用类似的东西git show --name-status $sha等等。


推荐阅读