#!/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
6条答案
按热度按时间r8uurelv1#
在git中没有这样的直接Map,因为文件名是包含文件的树对象的一部分,而不是作为文件内容的blob对象的一部分。
想要从SHA1哈希中检索文件名并不是一个常见的操作,所以也许您可以扩展它的真实的用例?
如果您正在查看当前文件(即HEAD commit),你可以尝试以下操作。
如果你想在以前的提交中找到内容,你需要做一些类似的事情。
zysjyyx42#
很棒的一行程序来做到这一点:
nxowjjhe3#
下面的shell脚本主要基于Which commit has this blob?和Aristotle Pagaltzis提供的答案。
我相信有人可以美化这个剧本,但它确实工作。这个想法是查看所有提交的树并搜索您的特定哈希。
y0u0uwnf4#
git rev-list <commit-list>
不会包含任何被rebase -i
删除的提交,现在只被reflog引用,所以如果上面的命令没有找到blob,你应该像这样检查reflog ie:ia2d9nvy5#
扩展@Harold对另一个答案的评论,此命令将给予您提供引入文件的提交以及提交上的文件路径:
r7knjye26#
提交文件并记下提交对象的sha1哈希。使用后
你会得到带有哈希值的文件名。
查看手册页面了解更多选项。