在特定提交时获取裸 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
到 运行 通过相同的一组修订以其他顺序添加 --reverse
到 git 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 排序。)
您可以在裸仓库上使用 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
到 运行 通过相同的一组修订以其他顺序添加 --reverse
到 git 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 排序。)