我想在git log中搜索特定的字符串,以查找在何处对其进行了修改/删除/添加。
我知道我可以使用pickaxe
(即git log -S"Text"
)做到这一点
当我运行此命令时,仅显示发生更改的提交的名称。我也尝试过git log -G"Text"
,但没什么区别。
当我尝试git log -p -S"Text"
时,它显示了两个文件版本之间的完全对比。
是否可以找到更改/添加/删除文字的确切位置(行)?
答案 0 :(得分:1)
Git不提供内置方法来执行此操作,但是您可以使用寻呼机的功能来查找文本。例如,如果使用较少,则可以运行git log -p -G"Text"
。然后,您可以通过键入/Text
在此命令的输出中搜索“文本”。到目前为止,这是找到所需内容的最简单方法。
有另一种相当丑陋的方法可以满足您的需要。如果您使用--word-diff-regex=Text
,Git将产生另一种单词差异格式,该格式将从一个“文本”实例突出到另一个实例,或者仅在一个实例存在的情况下突出显示。同样,使用您的传呼机将变得更好,更容易阅读。
答案 1 :(得分:0)
另一种实现目标的方法是使用外部diff驱动程序和$make all-recursive
软件包中的grepdiff
实用程序。 (对于Linux here,我回答了类似的问题。)
注意事项::我没有使用Windows,而且看来patchutils
is not available in the usual Windows package managers。因此,此答案的前提条件是您自己编译patchutils
(可能太多:P)。如果可以做到这一点,并找到将其安装在Git Bash中的方法,则此方法可能有效。
首先在grepdiff
下创建一个脚本并将其命名为C:\Program Files\Git\usr\bin
(注意:同样,我不使用Windows,但我正在阅读SO,因此这是一种简单的方法将内容添加到您的Git Bash pickaxe-diff
)中:
PATH
调用#!/bin/bash
# pickaxe-diff : external diff driver for Git.
# To be used with the pickaxe options (git [log|show|diff[.*] [-S|-G])
# to only show hunks containing the searched string/regex.
path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7
filtered_diff=$(diff -u -p $old_file $new_file | \
grepdiff "$GREPDIFF_REGEX" --output-matching=hunk | \
grep -v -e '+++ ' -e '--- ')
a_path="a/$path"
b_path="b/$path"
echo "diff --git $a_path $b_path"
echo "index $old_hex..$new_hex $old_mode"
echo "--- $a_path"
echo "+++ $b_path"
echo "$filtered_diff"
并告诉Git使用git log -G
脚本作为外部差异驱动程序:
pickaxe-diff
这将仅使用pickaxe-diff脚本生成差异,因此export GREPDIFF_REGEX=<string>;
GIT_EXTERNAL_DIFF=pickaxe-diff git log -p --ext-diff -G $GREPDIFF_REGEX
输出的其余部分(提交哈希,消息等)将保持不变。
注意事项
Git镐的工作方式是将输出限制为文件,其文件块会更改给定的字符串/正则表达式。这意味着,如果这些文件中的另一个大块也包含搜索字符串/正则表达式,但不进行更改,则仍将与上面的脚本一起显示。这是git log
的限制(最高版本0.3.4)。 patchutils项目的recently merged pull request在grepdiff
上添加了--only-match
标志,该标志应提供所需的功能以正确过滤出这些块(您需要0.4.0或更高的patchutils)。 / p>
我在this gist中写下了自己的解决方案。