Git ls-tree在子目录执行返回空结果的原因排查
问题原因解析
这个异常的核心原因是Git在子目录下执行命令时的路径上下文自动处理逻辑:
- 当你在仓库子目录(
d:\lome\hello)中执行git ls-tree <tree-ish>时,Git会自动将当前子目录的路径(hello)作为隐含的过滤参数添加到命令中。也就是说,你执行的git ls-tree 881e5,实际上等价于在仓库根目录执行git ls-tree 881e5 hello。 - 而
881e5对应的是根目录下hellonew3的tree对象,这个tree的内容里并不存在hello路径,所以命令返回空结果。 - 当你在仓库根目录执行
git ls-tree 881e5时,没有隐含的路径过滤参数,直接显示该tree对象的全部内容,自然能看到hellonew4目录和lome.txt文件的信息。 - 至于在子目录执行
git ls-tree head能正常返回结果,是因为head指向的commit的根tree中包含hello路径,等价于在根目录执行git ls-tree head hello,会正确显示hello子目录下的内容。
如果需要在子目录下直接查看881e5这个tree对象的完整内容,可以用如下命令明确指定不添加路径过滤:
git ls-tree 881e5 --
这里的--是Git的参数分隔符,用来告诉Git后面没有路径参数,避免自动添加当前子目录路径。
内容的提问来源于stack exchange,提问作者leo_256
相关产品推荐
相关产品推荐

