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

vaa*_*aab 2 git grep commit

这种情况是:我在我的git存储库中丢失了一些工作,这项工作曾经被提交过,但现在已经埋没在我的历史中,某些地方可能无法通过'git log --all'访问.我唯一能记住的是一些不同的字符串,可以确定一个文件,这是我工作的一部分.

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

这是我的解决方案:

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

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

Cas*_*bel 7

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

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

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