如何在未检出Git分支中递归列出含子模块提交内容的文件?
递归列出未检出Git分支的文件(含子模块内容)
由于git ls-tree本身没有--recurse-submodules选项,要实现未检出分支的递归文件列表(包含子模块提交内容),可以用以下两种方法:
方法1:自定义Shell脚本递归遍历
通过脚本解析目标分支的树结构,遇到子模块时自动递归查询其提交对应的文件列表:
#!/bin/bash # 替换为你要查询的目标分支名 TARGET_BRANCH="feature-branch" # 递归遍历Git树对象的函数 list_tree() { local tree_hash=$1 local prefix=$2 git ls-tree -r "$tree_hash" | while read -r mode type hash name; do if [ "$type" = "commit" ]; then # 识别到子模块,输出子模块目录并递归查询其内容 echo "${prefix}${name}/" list_tree "$hash" "${prefix}${name}/" else # 输出普通文件/目录的完整路径 echo "${prefix}${name}" fi done } # 获取目标分支对应的树对象哈希 BRANCH_TREE=$(git rev-parse "$TARGET_BRANCH^{tree}") # 启动遍历 list_tree "$BRANCH_TREE" ""
使用步骤:
- 将上述代码保存为
list-branch-files.sh - 执行
chmod +x list-branch-files.sh赋予执行权限 - 替换脚本中的
feature-branch为目标分支名,运行脚本即可得到完整文件列表
方法2:用git archive快速生成列表
借助git archive的--submodules选项打包分支(包含子模块),再通过tar查看归档内的文件列表,无需手动写递归逻辑:
# 替换为目标分支名 git archive --format=tar --submodules "your-branch" | tar -t
两种方法对比
- 方法1灵活性更高,可根据需求修改输出格式或添加额外处理逻辑;
- 方法2操作更简便,适合快速获取完整的文件路径列表。
内容的提问来源于stack exchange,提问作者intervort
相关产品推荐
相关产品推荐

