我在索引中添加了一个文件:
git add somefile.txt
然后我用这个文件获得了SHA1:
git hash-object somefile.txt
我现在有一个SHA1,我想使用SHA1检索索引中对象的文件名。
git show 5a5bf28dcd7944991944cc5076c7525439830122
此命令返回文件内容,但不返回文件名。
如何从SHA1获取完整的文件名和路径?
答案 0 :(得分:26)
git中没有这样的直接映射,因为文件名是包含文件的树对象的一部分,而不是作为文件内容的blob对象的一部分。
想要从SHA1哈希中检索文件名不是一般的操作,所以也许你可以扩展它的实际用例吗?
如果您正在查看当前文件(即HEAD提交),可以尝试以下操作。
git ls-tree -r HEAD | grep <SHA1>
如果你想在之前的提交中找到内容,你需要做更多这样的事情。
git rev-list <commit-list> | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"
答案 1 :(得分:25)
很棒的单行代码:
git rev-list --objects --all | grep <blob sha1>
答案 2 :(得分:7)
以下shell脚本主要基于Which commit has this blob?和Aristotle Pagaltzis提供的答案。
#!/bin/sh
obj_hash=$1
# go over all trees
git log --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
git ls-tree -r $tree | grep "$obj_hash" \
| while read a b hash filename ; do
if [ "$hash" == "$obj_hash" ]; then
f=$filename
echo $f
break
fi
if $f ; then break; fi
done
if $f; then break; fi
done
我确信有人可以美化这个脚本,但确实有效。 我们的想法是查看所有提交的树并搜索您的特定哈希值。
答案 3 :(得分:3)
git rev-list <commit-list>
不会包含任何由rebase -i
删除的提交,现在只能由reflog引用,所以如果上面的命令找不到blob,你也应该检查reflog,就像这样:
git reflog --all | \
cut -d\ -f1 | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X"
答案 4 :(得分:0)
提交文件并记下提交对象的sha1哈希值。之后使用
git ls-tree <commit-sha1>
您将获得带有哈希值的文件的名称。
查看手册页以获取更多选项。