git - Git从SHA1查找文件名

  显示原文与译文双语对照的内容

我在索引中添加了一个文件:

 
git add somefile.txt

 

然后,我得到了这个文件的SHA1:


git hash-object somefile.txt

现在我有一个 SHA1,我想用SHA1检索索引中对象的文件名。


git show 5a5bf28dcd7944991944cc5076c7525439830122

这里命令返回文件内容,但不返回文件的名称。

如何从SHA1获取完整文件名和路径?

时间:

在git中没有这样的直接映射,因为文件的名称是包含文件的树对象的一部分,而不是作为文件内容的blob对象。

从SHA1哈希中检索文件名不是一个常见的操作,所以你可以在实际的用例中扩展它?

如果你正在查看当前文件( 例如 。 头提交) 你可以尝试以下操作。


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"

执行这里操作的one-liner:


git rev-list --objects --all | grep <blob sha1>

下面的shell script 严重基于 ,后者提交了这个 blob? 和亚里士多德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

我确信有人可以美化这个脚本,但是它确实工作。 这个想法是查看所有的树,并搜索你的特定哈希。

git rev-list <commit-list> 将不包括任何承诺,例如被 rebase -i 现在只有reflog引用,如果没有找到blob上面的命令你也应该检查 reflog IE 是这样的:


git reflog --all | 
cut -d -f1 | 
xargs -n1 -iX sh -c"git ls-tree -r X | grep <BLOB_SHA> && echo X"

提交文件并注意提交对象的sha1哈希。 在那之后


git ls-tree <commit-sha1>

你会得到带有哈希的文件的名字。

查看手册页了解更多选项。

...