Ответ 1
Не уверен, но не флаг git diff -G <regex>
ОК?
-G < регулярное выражение >
Look for differences whose added or removed line matches the given <regex>.
Есть ли способ показать 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} "
Но хотелось бы узнать, что для этого есть команда.
Не уверен, но не флаг git diff -G <regex>
ОК?
-G < регулярное выражение >
Look for differences whose added or removed line matches the given <regex>.
Другая возможность - просмотреть весь diff и выполнить поиск с помощью обычных команд less
(введите /
, а затем шаблон).
Если у вас есть less
, чтобы показать некоторые строки перед совпадением, используя --jump-target=N
, это очень полезно. Попробуйте это следующим образом:
PAGER="/usr/bin/less --jump-target=10" git diff
Это означает, что совпадение должно отображаться в строке 10 (отображает 9 строк контекста выше), что может быть достаточно, чтобы также увидеть имя файла.
Вы также можете использовать, например. --jump-target=.5
, чтобы установить совпадение в середине экрана.
Вы пробовали git diff -S<string>
или git diff -G".*string.*"
? Обратите внимание, что они не эквивалентны, см. документацию о кирку для чего -S делает.
Я использую git log -p
, который открывает меньше (настраивается, хотя), который, в свою очередь, можно найти с помощью /. Там также git log -S <searchword>
.
Вот специальный инструмент сравнения, который позволяет 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