Intereting Posts
Что означают эти коды в «diff» и как избавиться от них? Поиск полного скрипта TUI для настройки даты и создания сетей CentOS 5 Как установить dos2unix на Linux без доступа root? Может ли система Linux иметь два IP одновременно? Нет звука в Linux Mint после двойной загрузки Windows 8 find, xargs и mv: переименование файлов с двойными кавычками, расширение и проблема с приоритетом bash Картирование C-1 не работает в VIM phpmyadmin не запускается после установки не может установить в linux mint rebecca Внедрение шифров eSTREAM? Можете ли вы получить данные git commit, используя cURL? Не удается выполнить печать на Fuji Xerox CM115W: «Не удалось выполнить фильтрацию» Как доказать, что интерпретатор есть / bin / bash при вызове cron создание и отправка самозаверяющего открытого ключа с использованием GnuPG в CentOS 7 Как найти все символические ссылки, указывающие на любой файл / каталог внутри данного каталога

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

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