Отображать только соответствующие фрагменты diff / patch на основе регулярного выражения

git log -G<regex> -p – замечательный инструмент для поиска истории кодовой базы для изменений, соответствующих указанному шаблону. Тем не менее, это может быть ошеломляющим, чтобы найти соответствующий кусок в выходе diff / patch в море в основном нерелевантных кусков.

Конечно, можно искать выход git log для исходной строки / регулярного выражения, но это мало что позволяет уменьшить визуальный шум и отвлечь многие несвязанные изменения.

Если вы --pickaxe-all git log , я вижу, что есть --pickaxe-all , что является полной противоположностью тому, что я хочу: он расширяет вывод (ко всему набору изменений), тогда как я хочу его ограничить (конкретным hunk).

По сути, я ищу способ «разумно» разобрать diff / patch на отдельные куски, а затем выполнить поиск против каждого hunk (таргетинг только на измененные строки), отказаться от неактивных кусков и вывести их это.

Существует ли такой инструмент, как я описываю? Есть ли лучший подход для получения согласованных / уязвимых кусков?

Некоторые начальные исследования, которые я сделал …

  • Если бы можно было выполнить grep вывод diff / patch и сделать значения параметра контекста динамическими – скажем, с помощью регулярных выражений вместо строк – этого может быть достаточно. Но grep точно не построен таким образом (и я не обязательно запрашиваю эту функцию).

  • Я нашел пакет patchutils , который изначально звучал так, как будто он может удовлетворить мои потребности. Но после прочтения его man страниц инструменты, похоже, не обрабатывают соответствующие группы на основе регулярных выражений. (Они могут принять список кусков, хотя …)

  • Я, наконец, наткнулся на splitpatch.rb , который, похоже, хорошо разбирается в синтаксическом анализе патча, но он должен быть значительно расширен, чтобы обрабатывать считывание патчей через stdin , сопоставление желаемых ханков, а затем вывод их.

2 Solutions collect form web for “Отображать только соответствующие фрагменты diff / patch на основе регулярного выражения”

здесь https://stackoverflow.com/a/35434714/5305907 описывается способ делать то, что вы ищете. эффективно:

git diff -U1 | grepdiff 'console' --output-matching=hunk

Он отображает только кучки, которые соответствуют заданной строке «console».

Не совсем то, о чем вы просите, но один способ grep through hunks – это режим интерактивного добавления. Это требует, чтобы вы проверили фиксацию после патча, который вам интересен

 git checkout COMMIT_ID 

затем верните еще один шаг в VCS, но не в рабочий каталог

 git reset --soft HEAD^ 

(В этот момент разница между индексом и рабочим каталогом будет соответствовать интересующему патчу.)

Теперь вы можете выполнить git add -p . Это запустит интерактивный сеанс, в котором есть опция / , позволяющая находить ханки, в которых какая-то строка соответствует регулярному выражению. Особенно полезно, если вы на самом деле хотите продолжить обработку этих патчей (например, при подготовке частичной вишневой подборки).

К сожалению, по крайней мере прямо сейчас команда / command в add -p работает только в одном файле, поэтому вам может потребоваться пропустить несколько незадачливых файлов.

  • Упаковка каталога и его содержимого в виде патча diff?
  • Почему diff вызывается при вызове из Makefile?
  • Как применить простой патч (обнаружение в обратном порядке)
  • aircrack-ng показывает отрицательный канал
  • Патч-файлы
  • как использовать patch и diff для объединения двух файлов
  • Получение патчей из списка рассылки с mutt и vim
  • Pipe diff файл в патч?
  • Как добавить к единому файлу патча?
  • Не удается найти файл для исправления в строке ввода 3
  • fatal: Не репозиторий git?
  • Interesting Posts

    Как удалить строку, если она начинается с. или a> с помощью sed?

    Как настроить функцию масштабирования xrandr для переключения на следующее или предыдущее разрешение в предопределенном списке?

    замещение процесса с помощью <(gunzip …) не выполняется

    Из какого пакета Debian есть / etc / environment?

    Каков максимальный диапазон символов grep в bash?

    Отсутствует менеджер сети в Kali Linux?

    Перемещение файлов с помощью find + xargs: target не является каталогом?

    Невозможно написать share samba с определенным именем

    когда начало работы cron после установки нового crontab?

    Восстановление файла, который перезаписывается cat>

    Должен ли я записывать ошибки вверх по течению, моим менеджерам распространения или тому и другому?

    2 монитора на графическом процессоре, 1 монитор интегрированной графики

    LUKS: изменить мастер-ключ

    Почему мой nic ethN вдруг называется p18pN?

    Как проверить значение Base64 для целого числа?

    Linux и Unix - лучшая ОС в мире.