在特定提交时获取裸 git 存储库中的文件树

Get a tree of files in a bare git repo on at a specific commit

您可以在裸仓库上使用 git ls-tree --full-tree -r HEAD 来获取该仓库中的所有文件,但我想要特定提交的列表。

即我想从第一次提交开始逐个提交遍历一个回购提交,直到我到达 HEAD 并查看文件树是如何演变的。我只关心文件和路径,其实我并不关心内容。

有没有办法在裸回购上做到这一点?我希望在一个裸仓库中使用它,因为我们有一些非常大的仓库,并且在 CPU 时间内对每个提交进行结帐的成本太高了。

当然,只需将 HEAD 替换为任何提交或树标识符,例如 SHA-1 或 gitrevisions 允许的任何说明符。

要获取 SHA-1 ID,请使用 git rev-list。例如,要从当前提交 (HEAD) 返回到每次合并时仅跟随第一父项的根:

git rev-list --first-parent --topo-order HEAD | while read rev; do
    git ls-tree --full-tree -r $rev
done

到 运行 通过相同的一组修订以其他顺序添加 --reversegit rev-list 的参数。

如果你想在合并时跟随所有父级,你可以简单地省略 --first-parent--topo-order 限制将确保父提交 ID 在其所有子项之前(或 --reverse,之后)。如果没有特定的排序,您将按提交日期以反向(或 --reverse、正向)顺序获得提交。

(如果您要跟踪树的演进,但也想很好地处理合并,您可能需要在此处进行更复杂的操作,其中 git rev-list 生成父提交 ID 和子提交 ID一起,因为即使使用 --topo-order 或其他一些排序标准将 parent/child 关系保持在一起,从扁平化的图形中,合并发生的确切位置也不会很明显。彻底阅读 the git rev-list documentation 以了解这个。使用 --first-parent 极大地简化了工作,因为它为您提供了简化的、严格的 parent/child 排序。)