【问题标题】:Git - finding a filename from a SHA1Git - 从 SHA1 中查找文件名
【发布时间】:2010-10-02 09:34:56
【问题描述】:

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

git add somefile.txt

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

git hash-object somefile.txt

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

git show 5a5bf28dcd7944991944cc5076c7525439830122

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

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

【问题讨论】:

标签: git sha1


【解决方案1】:

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

【讨论】:

  • 谢谢。我不知道你能做到这一点
  • 如果您不知道为&lt;commit-list&gt; 输入什么内容,--all 将搜索存储库中的所有分支。
  • 我的 git ls-tree 版本只接受 1 个修订版作为参数(git v1.7.4.4)。我把你的改成for rev in $(git rev-list --all); do git ls-tree -r $rev | grep $SHA; done | uniq
  • @halo:我很确定每个人的ls-tree 都接受一个修订参数,这就是我使用-n1xargs 的原因。
  • @CharlesBailey:啊,从来不知道-n 选项。似乎非常有用。感谢您的提示!但是上面列出的命令对我不起作用。不知道为什么,但幸运地同时解决了我的问题。
【解决方案2】:

很好的单线器来做到这一点:

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

【讨论】:

  • 它在两种情况下都能正常工作:(1) 所有 blob 都是唯一的,或者 (2) 您只对具有匹配哈希的最新 blob 感兴趣。例如,它省略了我的存储库中具有相同哈希的第二个(较旧的)blob。不过还是很有用的。用 git v2.20 测试。
  • 这很棒。你还会这样做,还是git describe &lt;sha1&gt; 现在更好?
【解决方案3】:

以下 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 &lt;commit-list&gt; 将不包括任何提交,例如被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"
    

    【讨论】:

      【解决方案5】:

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

      git ls-tree <commit-sha1>
      

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

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

      【讨论】:

      • 这是提交的 SHA,OP 询问文件的 SHA。
      猜你喜欢
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多