Подтвердить что ты не робот

Как сгладить git diff?

Есть ли способ показать git -diff, отфильтрованный по заданному шаблону.

Что-то вроде

git grepdiff pattern

changed file
+++ some sentence with pattern
changed file 2
--- some other pattern

К сожалению, самое простое решение недостаточно хорошее

git diff | grep pattern 

+++ some sentence with pattern
--- some other pattern
# not an option as doesn't put the filename close to the match

Я пришел с обходным путем, используя awk

git diff | awk "/\+\+\+/{f = \$2}; /PATTERN/ {print f \$0} "

Но хотелось бы узнать, что для этого есть команда.

4b9b3361

Ответ 1

Не уверен, но не флаг git diff -G <regex> ОК?

-G < регулярное выражение >

Look for differences whose added or removed line matches the given <regex>.

Ответ 2

Другая возможность - просмотреть весь diff и выполнить поиск с помощью обычных команд less (введите /, а затем шаблон).

Если у вас есть less, чтобы показать некоторые строки перед совпадением, используя --jump-target=N, это очень полезно. Попробуйте это следующим образом:

PAGER="/usr/bin/less --jump-target=10" git diff

Это означает, что совпадение должно отображаться в строке 10 (отображает 9 строк контекста выше), что может быть достаточно, чтобы также увидеть имя файла.

Вы также можете использовать, например. --jump-target=.5, чтобы установить совпадение в середине экрана.

Ответ 3

Вы пробовали git diff -S<string> или git diff -G".*string.*"? Обратите внимание, что они не эквивалентны, см. документацию о кирку для чего -S делает.

Ответ 4

Я использую git log -p, который открывает меньше (настраивается, хотя), который, в свою очередь, можно найти с помощью /. Там также git log -S <searchword>.

Ответ 5

Вот специальный инструмент сравнения, который позволяет grepping внутри изменений (но не контекст):

Использование

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

Это приведет к выводу этих строк в ваших изменениях, содержащих foo (включая строки, в которых foo исчез из-за ваших изменений). Любой шаблон grep можно использовать вместо foo.

Каждая строка вывода начинается со следующего префикса:

filename: oldlinenum: newlinenum|

script также может использоваться без опции --grep, и в этом случае он просто форматирует полный diff (то есть обеспечивает полный контекст), как описано выше.

mydiff

#!/bin/bash

my_diff()
{
    diff --old-line-format="$1"':%6dn:      |-%L'     \
         --new-line-format="$1"':      :%6dn|+%L'     \
         --unchanged-line-format="$1"':%6dn:%6dn| %L' \
         $2 $3
}

if [[ $1 == '--grep' ]]
then
    pattern="$2"
    shift 2
    my_diff "$1" "$2" "$5"|grep --color=never '^[^|]\+|[-+].\+'"$pattern"'.*'
else
    my_diff "$1" "$2" "$5"
fi

exit 0