如何找到在任何分支中引入字符串的Git提交?

ljsrvy3e  于 2023-08-01  发布在  Git
关注(0)|答案(7)|浏览(102)

我希望能够找到在任何分支的任何提交中引入的某个字符串,我怎么做?我发现了一些东西(我为Win32修改了),但是git whatchanged似乎没有查看不同的分支(忽略py 3 k块,它只是一个msys/win行馈送修复)

git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>

字符串
如果你的解决方案很慢,这并不重要。

ao218c7q

ao218c7q1#

您可以:

git log -S <search string> --source --all

字符串
查找添加或删除固定字符串search string的所有提交。--all参数意味着从每个分支开始,--source意味着显示哪些分支导致找到该提交。添加-p来显示每个提交将引入的补丁通常很有用。
从1.7.4开始的git版本也有类似的**-G选项,它接受正则表达式**。这实际上有不同的(而且更明显的)语义,在this blog post from Junio Hamano中解释。
正如thameera在评论中指出的那样,如果搜索词包含空格或其他特殊字符,则需要在搜索词周围加上引号,例如:

git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all


下面是一个使用-G查找function foo() {的示例:

git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all

dgiusagp

dgiusagp2#

--reverse也很有用,因为你想要第一个做出改变的提交:

git log --all -p --reverse --source -S 'needle'

字符串
这样,较旧的提交将首先出现。

8ehkhllq

8ehkhllq3#

在相同的答案中徘徊:

$ git config --global alias.find '!git log --color -p -S '

字符串

*!*是必需的,因为其他方式,git不能正确地将参数传递给-S。参见this response
--color
-p
有助于准确显示“whatchanged”

现在你可以

$ git find <whatever>


或者是

$ git find <whatever> --all
$ git find <whatever> master develop

xxhby3vn

xxhby3vn4#

Mark Longair’s answer是优秀的,但我发现这个更简单的版本为我工作。

git log -S whatever

字符串

9vw9lbht

9vw9lbht5#

git log -S"string_to_search" # options like --source --reverse --all etc

字符串
注意不要在S和“string_to_search”之间使用空格。在某些设置(git 1.7.1)中,你会得到如下错误:

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

dl5txlt9

dl5txlt96#

虽然这不能直接回答你的问题,但我认为这可能是一个很好的解决方案。我看到了我的代码的一部分,这是坏的。不知道是谁写的也不知道什么时候写的。我可以看到文件中的所有更改,但很明显代码已从其他文件移动到这个文件中。我想知道到底是谁先加的。
为此,我使用了Git bisect,它很快就让我找到了罪人。
我运行了git bisect start,然后运行了git bisect bad,因为检出的修订版有这个问题。因为我不知道问题是什么时候发生的,所以我把第一次提交作为“好”的目标,git bisect good <initial sha>
然后我就一直在repo中搜索坏代码。当我找到它时,我运行git bisect bad,当它不在那里时:git bisect good
在~11个步骤中,我已经覆盖了~1000个提交,并找到了引入问题的确切提交。非常好

wgmfuz8q

wgmfuz8q7#

不知道为什么接受的答案在我的环境中不起作用,最后我运行下面的命令来获得我需要的东西

git log --pretty=format:"%h - %an, %ar : %s"|grep "STRING"

字符串

相关问题