假设我有一个可能已存在于git存储库中的文件,它可能位于多个路径名下,即使在同一个提交中也是如此。
如何找到包含带有与该文件对应的哈希的blob的所有提交,并列出这些提交以及文件所在的路径名?
是否有一个find-file-by-hash技术,还可以搜索索引和工作目录?
答案 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关联的文件的名称以及提交名称。