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

标签 git grep commit

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

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

这是我的解决方案:

我已经通过批处理几个命令找到了我的提交 SHA1:

  • 首先在 .git/objects 中找到所有“blob”对象,“git cat”它们(并使用 grep)以找到包含我的文件的 blob 的 SHA1。
  • 然后我必须解析所有“树”对象以找到包含文件 SHA1 的对象……直到没有包含在其他“树”对象中的树对象。
  • 最终解析包含此根树的所有提交。

最佳答案

如果提交可以从某个引用到达,最佳解决方案肯定是镐搜索:git log -Sstring --all .

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

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

关于git - 如何找到包含给定字符串的文件的树的提交 SHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451232/

相关文章:

用于搜索提交消息的 Git 别名

svn - 在 Subversion 上提交代码(第一次)

bash - 如何在我的 git 提交消息中提交代码块

git - rhc ssh [没有可用的系统 SSH] 错误

unix - 如何删除匹配的行和上一行?

linux - Apache 日志 grep、awk 或 sed

linux - 如何剥离grep的输出?

git - 使用 libgit2sharp 检查远程分支

git - 重命名 git 裸存储库中的分支

git - $git log 等我写 smth