Git:在所有先前版本中搜索文件

7

考虑一个包含以下行的Python配置文件:

THEME = 'gum'

THEME关键字只出现一次,所以当我想知道THEME是什么时,我会搜索这个文件:

grep THEME pelicanconf.py

文件保存在git中,我想在之前的git提交记录中grep THEME,以便知道何时更改了这行代码。
有没有一种优雅的方法来grep一个git文件的整个历史记录?

git log -S'THEME' -- pelicanconf.py 有帮助吗? - knittl
可能是重复的问题:https://dev59.com/9Goy5IYBdhLWcg3wnPSJ#8436006 - John_West
2个回答

4

git log -S'THEME' -- pelicanconf.py | xargs -n 1 git show 显示更改了 THEME 的每个提交的内容。

但是它会打印出完整的提交记录,而不仅仅是更改。

var="THEME"; git log -S"$var" -p -- pelicanconf.py | egrep "$var|commit|Date:"

将显示所有包含 THEME 变量的变体,包括提交哈希和日期。

感谢 @knittl 提供的 -p 选项。

此外,还可以使用 gitk 解决问题,请参见此处


只寻找THEME,不要gum。然而,即使是git log -S'THEME' -- pelicanconf.py也无法解决问题。 - Adam Matan
@AdamMatan:你在git log中缺少什么? - knittl
1
@John_West:使用git log -p代替git log … | xargs … - knittl

2
做你想要的事情的方法是使用bisect run <script>。继续像以前一样使用bisect,并使用带有脚本选项的bisect。
Bisect将搜索您在给定范围内的所有提交,通过适当的退出代码,您可以告诉它代码是好还是坏。
该脚本将返回适当的代码以进行跳过(或者在您的情况下更适合的125以表示无法测试)。
请注意,脚本(在上面的示例中为my_script)如果当前源代码正确,则应该以0代码退出,如果当前源代码错误,则应该以1至127(包括125)之间的代码退出。
任何其他退出代码都将中止二分过程。值得注意的是,通过“exit(-1)”终止的程序会留下$?= 255(请参阅exit(3)手册页),因为该值被截断为“& 0377”。
特殊的退出代码125应该用于当前源代码无法测试的情况。如果脚本以此代码退出,则将跳过当前修订版(请参见上面的git bisect skip)。选择125作为此目的的最高合理值,因为POSIX shell使用126和127来表示特定的错误状态(127用于未找到命令,126用于找到但不可执行的命令 - 这些详细信息并不重要,就“bisect run”而言,它们是脚本中的正常错误)。 二分示例项目
使用 git log 您可以在日志中传递 -p 标志来跟踪特定文件。
git log -p filename

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