2011-08-17 41 views

回答

-1

,因为它已经接受了我不能删除这个答案,但skaar's answer回答OP的问题更好。 (它仍然需要做一个不寻常的事情,但我可以看到有为什么你可能需要的原因。)

+0

我想使用Git除文件管理以外的其他东西。不同的“文件”具有不同的“类型”(在文件中编码的字符串类型),我想查找特定类型的对象数据库中的所有对象。 –

+0

我想没有直接的办法。我会将此标记为答案,因为这表明了这一点。我查看了git-grep源代码,我认为可以直接修改它以输出SHA-1 ID。 –

+0

您的解决方案仅适用于当前签出的分支,OP希望搜索所有对象。 – vman

2

编辑:基于使用Git版本2.7.4

看起来像新的测试结果更新我发布的解决方案只通过reflog。因此,如果您删除了一条reflog条目,即使对象仍然存在,该条目也不会被搜索。

所以,你将不得不做这样的事情:Git - how to list ALL objects in the database

旧的解决方案:只有当对象是在引用日志

要查找的字符串作品“文本

{ 
    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 

从派生“in all local objects:

git log --reflog -Stext 

要查找所有本地对象的模式“模式”:

git log --reflog --grep=pattern 

这将通过所有的搜索对象,所以它会工作,即使提交/分支被删除。一旦从本地存储库中删除了一个对象(例如通过gc),它将不再包含在搜索中。

+0

我通常不需要搜索已删除的元素(不要忘记reflog是本地的repo:如果再次克隆,reflog将为空)。但是对于同一回购商的本地搜索,这确实会起作用。 +1 – VonC

+0

对,我同意搜索所有对象并不常见。然而,这是OP想要的。这可能很有用,我能想到的一个例子是,如果你错误地提交了一个密码,并想从本地存储库中删除它。另一种情况是,如果你从reflog中删除了一些内容并想恢复它(假设gc没有删除blob)。 – vman

+0

我已经尝试过,但它没有工作(grep只是不工作这种情况下,文件说git-rev-list --grep是提交消息,但不blob内容,也许这是原因?)。但是我发现了另一个解决方案:'git grep'text'$(git fsck --unreachable | grep'^ unreachable blob'| cut -d''-f3)''搜索了所有不可用的文本块 –

2

我做了以下弄清楚,如果一些代码,我会写永远失去了,或者也许是隐藏在一些“不可达”承诺:

# 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>。但是,它不会告诉你哪个对象包含它。但是通过这样做,我发现了我缺少的代码,最终我找回了它。