Git - 从SHA1中查找文件名

git*_*oob 34 git sha1

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

git add somefile.txt
Run Code Online (Sandbox Code Playgroud)

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

git hash-object somefile.txt
Run Code Online (Sandbox Code Playgroud)

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

git show 5a5bf28dcd7944991944cc5076c7525439830122
Run Code Online (Sandbox Code Playgroud)

此命令返回文件内容,但不返回文件名.

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

CB *_*ley 27

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

想要从SHA1哈希中检索文件名是不常见的操作,所以也许你可以扩展它的真实世界用例?

如果您正在查看当前文件(即HEAD提交),您可以尝试以下操作.

git ls-tree -r HEAD | grep <SHA1>
Run Code Online (Sandbox Code Playgroud)

如果你想在之前的提交中找到内容,你需要做更多这样的事情.

git rev-list <commit-list> | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"
Run Code Online (Sandbox Code Playgroud)

  • 如果您不知道要为`<commit-list>`输入什么,`--all`将搜索存储库中的所有分支. (6认同)

bra*_*ipt 25

伟大的单行做到这一点:

git rev-list --objects --all | grep <blob sha1>
Run Code Online (Sandbox Code Playgroud)

  • 它适用于两种情况:(1) 所有 blob 都是唯一的,或者 (2) 您只对具有匹配哈希的最新 blob 感兴趣。例如,它省略了我的存储库中具有相同哈希值的第二个(较旧的)blob。不过还是很有用的。使用 git v2.20 测试。 (2认同)

nim*_*odm 7

以下shell脚本很大程度上基于哪个提交有这个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
Run Code Online (Sandbox Code Playgroud)

我敢肯定有人可以美化这个脚本但它确实有效.我们的想法是查看所有提交的树并搜索您的特定哈希值.