在git存储库中通过相应的blob哈希查找文件?

时间:2016-09-20 18:24:12

标签: git

假设我有一个可能已存在于git存储库中的文件,它可能位于多个路径名下,即使在同一个提交中也是如此。

如何找到包含带有与该文件对应的哈希的blob的所有提交,并列出这些提交以及文件所在的路径名?

是否有一个find-file-by-hash技术,还可以搜索索引和工作目录?

2 个答案:

答案 0 :(得分:0)

您可以找到答案here(重复)。

汇总:

git rev-list <commit-list> | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"

您可以使用--all代替<commit-list>来查看所有提交。

答案 1 :(得分:0)

好的,要扩展accepted answer ...

至于查找所有具有路径名的提交,那么接受的答案中的脚本唯一不适合您的是打印路径名。但是不要害怕 - 它很容易修改。

如果您前往附近的Git存储库并运行git ls-tree -r HEAD,您将看到此命令转储由命名提交(在我们的示例中为HEAD)引用的整个树层次结构 - SHA-1名称和&#34;正常&#34;文件名。来自答案的脚本只是grep这个输出来找到SHA-1名称并忽略其余的。

所以我们可以将其修改为:

#!/bin/sh
obj_name="$1"
shift
git log "$@" --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
    git ls-tree -r "$commit" | while read _ _ sha name; do \
      if [ "$sha" == "$obj_name" ]; then
        echo "$sha\t$name"
        break
      fi
    done
  done

...现在它还将打印与目标blob关联的文件的名称以及提交名称。