Git:获得所有blob图案

时间:2011-08-17 06:45:59

标签: git grep

在Git中,如何在对象数据库中找到包含字符串模式的所有blob的SHA-1 ID? git-grep仅提供文件路径,而不提供sha1 ID。

4 个答案:

答案 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的问题。 (这仍然是一件不寻常的事情,但我可以看到你可能需要的原因。)