在Git中,如何在对象数据库中找到包含字符串模式的所有blob的SHA-1 ID? git-grep
仅提供文件路径,而不提供sha1 ID。
答案 0 :(得分:4)
我做了以下工作来弄清楚我写的一些代码是否永远丢失,或者可能隐藏在一些"无法访问"提交:
# Assuming you're at the root of the git repository
> cd .git/objects
# Search all objects for a given string (assuming you're in .git/objects)
> find ?? -type f | sed s!/!! | git cat-file --batch | grep --binary-files=text <SEARCH_STRING>
如果任何 git对象包含<SEARCH_STRING>
,这将产生输出。但是,它不会告诉你哪个对象包含它。但通过这样做,我找到了我丢失的代码,最终我能够将其恢复。
答案 1 :(得分:3)
您可以使用pickaxe选项尝试使用git日志:
git log -Sstring --all
请参阅“How to find commit SHA1 of a tree containing a file containing a given string”
答案 2 :(得分:3)
编辑:使用Git 2.7.4版本基于新测试结果进行更新
看起来我发布的解决方案只通过reflog。因此,如果删除reflog条目,则不会搜索该条目 - 即使该对象仍然存在。
所以你必须做类似的事情:
{
git rev-list --objects --all --grep="text"
git rev-list --objects -g --no-walk --all --grep="text"
git rev-list --objects --no-walk --grep="text" \
$(git fsck --unreachable |
grep '^unreachable commit' |
cut -d' ' -f3)
} | sort | uniq
派生自:Git - how to list ALL objects in the database
旧解决方案:仅当对象在reflog中
时才有效在所有本地对象中查找字符串“text”:
git log --reflog -Stext
在所有本地对象中找到“pattern”模式:
git log --reflog --grep=pattern
这将搜索所有对象,因此即使删除了提交/分支,它也会起作用。一旦从本地存储库中删除了一个对象(例如通过gc),它将不再包含在搜索中。
答案 3 :(得分:-1)
我无法删除此答案,因为它已被接受,但skaar's answer更好地回答了OP的问题。 (这仍然是一件不寻常的事情,但我可以看到你可能需要的原因。)