我希望能够找到在任何分支的任何提交中引入的某个字符串,我怎么做?我发现了一些东西(我为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>
字符串
如果你的解决方案很慢,这并不重要。
7条答案
按热度按时间ao218c7q1#
您可以:
字符串
查找添加或删除固定字符串
search string
的所有提交。--all
参数意味着从每个分支开始,--source
意味着显示哪些分支导致找到该提交。添加-p
来显示每个提交将引入的补丁通常很有用。从1.7.4开始的git版本也有类似的**
-G
选项,它接受正则表达式**。这实际上有不同的(而且更明显的)语义,在this blog post from Junio Hamano中解释。正如thameera在评论中指出的那样,如果搜索词包含空格或其他特殊字符,则需要在搜索词周围加上引号,例如:
型
下面是一个使用
-G
查找function foo() {
的示例:型
dgiusagp2#
--reverse也很有用,因为你想要第一个做出改变的提交:
字符串
这样,较旧的提交将首先出现。
8ehkhllq3#
在相同的答案中徘徊:
字符串
*!*是必需的,因为其他方式,git不能正确地将参数传递给-S。参见this response
--color和-p有助于准确显示“whatchanged”
现在你可以
型
或者是
型
xxhby3vn4#
Mark Longair’s answer是优秀的,但我发现这个更简单的版本为我工作。
字符串
9vw9lbht5#
字符串
注意不要在S和“string_to_search”之间使用空格。在某些设置(git 1.7.1)中,你会得到如下错误:
型
dl5txlt96#
虽然这不能直接回答你的问题,但我认为这可能是一个很好的解决方案。我看到了我的代码的一部分,这是坏的。不知道是谁写的也不知道什么时候写的。我可以看到文件中的所有更改,但很明显代码已从其他文件移动到这个文件中。我想知道到底是谁先加的。
为此,我使用了Git bisect,它很快就让我找到了罪人。
我运行了
git bisect start
,然后运行了git bisect bad
,因为检出的修订版有这个问题。因为我不知道问题是什么时候发生的,所以我把第一次提交作为“好”的目标,git bisect good <initial sha>
。然后我就一直在repo中搜索坏代码。当我找到它时,我运行
git bisect bad
,当它不在那里时:git bisect good
。在~11个步骤中,我已经覆盖了~1000个提交,并找到了引入问题的确切提交。非常好
wgmfuz8q7#
不知道为什么接受的答案在我的环境中不起作用,最后我运行下面的命令来获得我需要的东西
字符串