Отображать только соответствующие фрагменты 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 , сопоставление желаемых ханков, а затем вывод их.

  • Как применить простой патч (обнаружение в обратном порядке)
  • получить информацию об обновлении пакета в openSuSE
  • Применение одного патча к файлам в нескольких каталогах
  • Dwm-pertag patch - сохранение состояния между перезапусками
  • RPM и исправление
  • Патч без изменения владельца и группы
  • слияние, которое работает с детализацией слов вместо строки
  • Почему diff вызывается при вызове из Makefile?
  • 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 работает только в одном файле, поэтому вам может потребоваться пропустить несколько незадачливых файлов.

    Interesting Posts

    Новые (логин) оболочки (окно) открывается в $ HOME вместо $ PWD (как и раньше) на macOS. Что дает?

    анонимный или гостевой вход в vsftpd?

    Почему kill не имеет параметра для файла, а не для номера порта?

    Как избавиться от спама `mosh“ last -f / var / log / wtmp`?

    Как удалить файл в формате QNX4, когда CF-карта смонтирована как доступная только для чтения в Linux?

    Установка Java на OpenSuse

    Linux как производительность виртуализации хоста и клиента в Core i7?

    Больше звуков уведомлений

    Как запустить Unicorn с помощью systemd / systemctl?

    Символическая ссылка локальная .jpg файл в .jpg файл в Интернете

    Есть ли способ, чтобы жесткий диск объемом 80 ГБ был минимальным?

    если я использую мультипликативные суффиксы в systemd, то ошибки – «не удалось проанализировать значение ресурса»

    Только операционная система RDP

    Я бы хотел использовать одну из трех команд sed (диапазоны чисел)

    Перенаправление не переписывание файла, а просто создание пустой

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