Git log -S/-G需指定深层路径才生效?是否存在文件数量限制?
嘿,这个问题我之前也碰到过,其实和文件数量限制完全没关系,核心是Git处理已删除文件搜索的逻辑差异在搞鬼~
先给你吃个定心丸
git log的-S/-G选项没有文件数量限制,你遇到的情况是Git默认搜索逻辑和指定路径后的逻辑不一样导致的。
为啥不指定路径找不到?
默认情况下,git log -S'Sample text'的逻辑是:找所有提交里diff明确显示该字符串被添加或删除的变更——简单说,只有当提交修改了某个现有文件的内容(比如在文件里加了一行包含Sample text的内容,或者删掉了这行),才会被匹配到。
但你是删除了整个文件,这个提交的diff只会显示类似delete mode 100644 ./components/CommonLibs/ComponentA/req/content.txt的记录,不会把文件内容的细节放进去。Git看不到这个删除操作和Sample text的关联,自然不会把这个提交放进结果里。
指定路径后为啥就找到了?
当你加上路径参数(比如-- ./components/CommonLibs/ComponentA)时,Git的搜索范围被锁定在这个路径下的所有历史文件(包括已经被删除的)。这时候Git会遍历该路径下的每个提交版本,主动检查文件内容里有没有Sample text,并且追踪这个字符串的出现次数变化——包括“文件存在时包含该字符串,之后被删除导致次数直接变0”的情况,所以就能定位到删除文件的那个提交了。
给你个小技巧
如果不想每次都写这么长的路径,可以试试结合--follow选项直接指定已删除的文件名:
git log --all -S'Sample text' --follow -- ./components/CommonLibs/ComponentA/req/content.txt
--follow会让Git追踪文件的删除/重命名历史,哪怕文件已经不在当前工作区了,也能帮你找到相关提交。
内容的提问来源于stack exchange,提问作者Nasha

