如何高效列出Git所有分支中的全部已追踪文件?
如何高效列出Git所有分支中的全部已追踪文件
当然有更高效的方法——你原来的脚本会为每个分支单独启动一次git ls-tree进程,分支数量多的时候,频繁的进程启动开销会非常可观,而且大量重复文件的输出也会增加后续sort和uniq的处理压力。
优化方案1:单次调用Git处理所有分支
直接一次性把所有分支作为参数传给git ls-tree,只启动一次Git进程就能获取所有分支的文件列表,再做去重:
git ls-tree -r --name-only $(git for-each-ref --format='%(refname:short)' refs/heads/) | sort -u
或者用分支对应的提交哈希传递(避免分支名含特殊字符的问题):
git for-each-ref --format='%(objectname)' refs/heads/ | xargs git ls-tree -r --name-only | sort -u
优化方案2:利用Git对象数据库直接提取唯一文件路径
如果想进一步减少数据处理量,可以直接从Git对象数据库中提取所有分支涉及的唯一文件路径:
git rev-list --all --objects | grep -v '^[0-9a-f]\{40\}$' | awk '{print $2}' | sort -u
这个命令的逻辑:
git rev-list --all --objects:列出所有分支中所有提交涉及的所有对象(含文件、目录)grep -v '^[0-9a-f]\{40\}$':过滤掉纯哈希值的行(这类是目录对象)awk '{print $2}':提取文件路径sort -u:去重得到唯一的文件列表
这个方法在文件重复度高的常规场景下,效率提升会更明显。
内容的提问来源于stack exchange,提问作者francesco
相关产品推荐
相关产品推荐

