如何查找在工作目录中不存在的文件的提交记录

3
我有一个文件的文件路径和 blob 名称,但该文件不在工作树中。如何找到此文件存在于哪些提交中?
编辑:
我可以使用 git cat-file -p <blob> 命令查看文件,但是 log -Slog <path>bisect 命令都没有给出任何结果。
这个文件可能在不同的分支中,甚至可能在一些已获取但未检出的分支中。

1
如果文件曾经存在,但在某个时间点被删除了,你可以使用git bisect来找出删除它的提交。 - undefined
这个答案可能是你需要的(找到包含该 blob 的所有提交):https://dev59.com/JXVC5IYBdhLWcg3wpi98#223890 但是你需要在 shell 脚本的第四行(以 git log 开头)中添加 --all,否则只会搜索 HEAD 的历史记录。 - undefined
4个回答

3

Git日志

从这里开始:https://git-scm.com/book/en/v2/Git-Tools-Searching

Git日志是一个记录提交历史的工具。它可以帮助您查看项目中的更改,以及谁、何时、为什么进行了更改。您可以使用各种选项和参数来定制输出格式和过滤条件。在日志中查找特定提交或作者的信息非常容易。
git log -S "some content in that file"

搜索文件名:

git log --follow -- my_file_name.txt

Git Bisect

git bisect start HEAD <initial_commit>
git bisect run [[ -e my_file_name.txt ]]

没有结果。可能是因为我现在处于不同的分支上。 - undefined

2

1

如您所询问,查找哪些提交包含特定路径下的特定blob,git并没有一个一键操作,但生成任何你想要的内容非常容易。

git log --all --reflog --format='%H:path/to/it %H' \
| git cat-file --batch-check='%(rest) %(objectname)' \
| awk '$2==myblob{print $1}' myblob=`git rev-parse mycommit:path/to/it` \
| git log --no-walk --stdin --oneline

如果只是大致浏览,那么仅看前两行就足够了。


1
我不明白这个是如何做到的,但它确实做到了。 - undefined
需要更多的解释。我应该用什么来替换 mycommit 吗?我得到了 fatal: invalid object name 'mycommit' 的错误。如果我尝试用 HEADmain 来替换 mycommit,我会得到类似 fatal: path 'foobar' does not exist in 'main' 的错误。 - undefined

1
使用git log path/to/file命令来显示修改该文件的每个提交,包括删除该文件的提交。

1
我遇到了“未知的修订版本或路径不在工作树中”的问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接