Git -从SHA1中查找文件名

ycggw6v2  于 2023-05-15  发布在  Git
关注(0)|答案(6)|浏览(147)

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

git add somefile.txt

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

git hash-object somefile.txt

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

git show 5a5bf28dcd7944991944cc5076c7525439830122

此命令返回文件内容,但不返回文件名。
如何从SHA1中获取完整的文件名和路径?

r8uurelv

r8uurelv1#

在git中没有这样的直接Map,因为文件名是包含文件的树对象的一部分,而不是作为文件内容的blob对象的一部分。
想要从SHA1哈希中检索文件名并不是一个常见的操作,所以也许您可以扩展它的真实的用例?
如果您正在查看当前文件(即HEAD commit),你可以尝试以下操作。

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"
zysjyyx4

zysjyyx42#

很棒的一行程序来做到这一点:

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

nxowjjhe3#

下面的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

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

y0u0uwnf

y0u0uwnf4#

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"
ia2d9nvy

ia2d9nvy5#

扩展@Harold对另一个答案的评论,此命令将给予您提供引入文件的提交以及提交上的文件路径:

git describe --always <blob-hash>
  • 在git版本2.30.2上测试。*
r7knjye2

r7knjye26#

提交文件并记下提交对象的sha1哈希。使用后

git ls-tree <commit-sha1>

你会得到带有哈希值的文件名。
查看手册页面了解更多选项。

相关问题