在特定提交中获取裸git仓库中的文件树

时间:2015-12-01 19:59:43

标签: git git-bare

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

即。我希望通过第一次提交的提交来执行repo提交,直到我在HEAD并查看文件树是如何演变的。我只关心文件和路径,我实际上并不关心内容。

有没有办法在裸仓库上做到这一点?我希望这个只是一个非常大的回购,因为我们有一些非常大的回购并且每次提交结账都会在CPU时间上花费太多。

1 个答案:

答案 0 :(得分:1)

当然,只需将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,因为即使使用--topo-order或其他一些排序标准将父/子关系保持在一起,从平面图中确切地说,合并发生的位置也不会很明显。请仔细阅读the git rev-list documentation。使用{ {1}}极大地简化了工作,因为它为您提供了简化的严格的父/子订购。)