我希望能够找到在任何提交中引入的某个字符串
任何分支,我怎么做呢?我发现了一些东西(我为Win32修改了),
但是git所做的改变似乎并没有深入到不同的分支
(忽略py3k块,这只是一个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>
如果你的解决方案很慢,这并不重要。
虽然这并没有直接回答你的问题,但我认为这可能是你未来的一个很好的解决方案。我看到了我的一部分代码,很糟糕。不知道是谁写的,什么时候写的。我可以看到文件中的所有更改,但很明显,代码已经从其他文件移到了这个文件中。我想知道到底是谁先把它加进去的。
要做到这一点,我使用Git平分,这很快让我找到罪人。
我运行git bisect start,然后git bisect bad,因为修订检查出来有这个问题。因为我不知道问题是什么时候发生的,我把第一次提交的目标定为“good”,git平分good <initial sha>。
然后我就一直在回购中寻找坏代码。当我找到它时,我运行git bisect bad,当它不存在时:git bisect good。
在大约11个步骤中,我已经讨论了大约1000个提交,并找到了引入问题的确切提交。好极了。
虽然这并没有直接回答你的问题,但我认为这可能是你未来的一个很好的解决方案。我看到了我的一部分代码,很糟糕。不知道是谁写的,什么时候写的。我可以看到文件中的所有更改,但很明显,代码已经从其他文件移到了这个文件中。我想知道到底是谁先把它加进去的。
要做到这一点,我使用Git平分,这很快让我找到罪人。
我运行git bisect start,然后git bisect bad,因为修订检查出来有这个问题。因为我不知道问题是什么时候发生的,我把第一次提交的目标定为“good”,git平分good <initial sha>。
然后我就一直在回购中寻找坏代码。当我找到它时,我运行git bisect bad,当它不存在时:git bisect good。
在大约11个步骤中,我已经讨论了大约1000个提交,并找到了引入问题的确切提交。好极了。
你可以:
git log -S <search string> --source --all
查找添加或删除固定字符串搜索字符串的所有提交。——all参数表示从每个分支开始,而——source表示显示哪些分支导致找到该提交。添加-p来显示每次提交都会引入的补丁通常是有用的。
从1.7.4开始的git版本也有类似的-G选项,它接受正则表达式。这实际上有不同的(更明显的)语义,在Junio Hamano的博客文章中解释了这一点。
正如thameera在评论中指出的,如果搜索词包含空格或其他特殊字符,则需要在搜索词周围加上引号,例如:
git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all
下面是一个使用-G查找函数foo(){的例子:
git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all