如何查找包含包含给定字符串的文件的树的提交SHA1

时间:2010-08-10 16:32:38

标签: git grep commit

情况就是这样:我在我的git存储库中丢失了一些工作,这项工作曾经被提交,但现在已经埋没在我的历史中,可能无法通过'git log --all'<无法到达的地方/ strong>即可。 我唯一记得的是一些不同的字符串,可以在此时查明属于我工作的文件。

我有一个解决方案......但是很长,你有更好的解决方案吗?

这是我的解决方案:

我设法通过批处理命令找到我的提交SHA1:

      
  • 首先找到.git / objects中的所有'blob'对象,'git cat'ing他们(并使用grep)找到包含我文件的blob的SHA1。
  •   
  • 然后我不得不解析所有'tree'对象,找到包含文件SHA1的对象......直到没有其他'tree'对象包含的树对象。
  •   
  • 最终解析包含此根树的所有提交。

1 个答案:

答案 0 :(得分:7)

如果可以从某个ref访问提交,那么最佳解决方案肯定是pickaxe搜索:git log -Sstring --all

如果无法访问,那么你是对的,你将不得不进行一些挖掘。如果你认为你有遍布各处的悬空提交,最简单的方法就是使用git fsck --lost-found找到你的悬空提交。 (它还会打印悬空blob。)然后,您可以在每个SHA1上使用git grep <commit>,并找到您的字符串。

另一方面,如果你认为你有一些被修剪的候选分支,并且你的目标将在其中一个上,我会使用git reflog show回顾你的reflogs,找到提交在他们的提示,并重新创建它们,所以你可以做git log -Sstring <branches> ^master