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

  • Применение патча ядра для поддержки режима PIC
  • Зачем использовать diff / patch, когда проще просто использовать cp
  • получить информацию об обновлении пакета в openSuSE
  • Почему diff вызывается при вызове из Makefile?
  • fatal: Не репозиторий git?
  • Как я могу заставить FreeBSD `patch` переносить нулевые байты?
  • Храните патч в синхронизации с изменяющимся исходным кодом
  • Получение патчей из списка рассылки с mutt и vim
  • 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
    Linux и Unix - лучшая ОС в мире.