Git - 从 SHA1 查找文件名

问题描述 投票:0回答:6

我向索引添加了一个文件:

git add somefile.txt

然后我通过以下方式获取了该文件的 SHA1:

git hash-object somefile.txt

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

git show 5a5bf28dcd7944991944cc5076c7525439830122

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

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

git sha1
6个回答
40
投票

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"

38
投票

伟大的一句台词可以做到这一点:

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

9
投票

以下 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

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


4
投票

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
投票

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

git describe --always <blob-hash>

在 git 版本 2.30.2 上测试。

编辑:如果您不想要标签/分支名称,而是想要完整的提交 ID,您可以尝试以下操作:

git describe --always --exclude=\* --abbrev=40 <blob-hash>

-1
投票

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

git ls-tree <commit-sha1>

您将获得带有哈希值的文件名称。

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

© www.soinside.com 2019 - 2024. All rights reserved.