如何使用git log pickaxe显示更改本身?

时间:2018-07-30 14:32:42

标签: git git-log

我想在git log中搜索特定的字符串,以查找在何处对其进行了修改/删除/添加。

我知道我可以使用pickaxe(即git log -S"Text")做到这一点

当我运行此命令时,仅显示发生更改的提交的名称。我也尝试过git log -G"Text",但没什么区别。

当我尝试git log -p -S"Text"时,它显示了两个文件版本之间的完全对比。

是否可以找到更改/添加/删除文字的确切位置(行)?

我检查了相关帖子12,但未回答我的问题。我正在使用Windows操作系统。

2 个答案:

答案 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中的方法,则此方法可能有效。

  1. 首先在grepdiff下创建一个脚本并将其命名为C:\Program Files\Git\usr\bin(注意:同样,我不使用Windows,但我正在阅读SO,因此这是一种简单的方法将内容添加到您的Git Bash pickaxe-diff)中:

    PATH
  2. 调用#!/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 requestgrepdiff上添加了--only-match标志,该标志应提供所需的功能以正确过滤出这些块(您需要0.4.0或更高的patchutils)。 / p>


我在this gist中写下了自己的解决方案。