Я пытаюсь найти существенные различия в исходном коде C / C ++, в котором изменяется только исходный код. Я знаю, что вы можете использовать git diff -G<regex>
но это кажется очень ограниченным в виде регулярных выражений, которые могут быть запущены. Например, он не предлагает способ игнорировать многострочные комментарии в C / C ++.
Есть ли способ в git или предпочтительно в libgit2 игнорировать комментарии (включая многострочные), пробелы и т. Д. Перед запуском diff? Или способ определения, является ли строка из различий вывода комментарием или нет?
git diff -w
игнорировать пробельные различия.
Вы не можете игнорировать многострочные комментарии, потому что git — это инструмент управления версиями, а не зависимый от языка интерпретатор. Он не знает, что ваш код — C ++. Он не анализирует файлы на предмет семантики, поэтому не может интерпретировать, что является комментарием, а что нет. В частности, он использует diff (или настроенный difftool) для сравнения текстовых файлов и ожидает построчное сравнение.
Я согласен с @ andrew-c в том, что вы действительно просите сравнить две части кода без комментариев. Более конкретно, вы просите сравнить строки кода, где все многострочные комментарии были превращены в пустые строки. Вы оставляете там пустые строки, чтобы у вас были правильные номера строк для ссылки на обычную копию.
Таким образом, вы можете вручную преобразовать два состояния кода, чтобы исключить многострочные комментарии … или вы можете посмотреть на создание своей собственной оболочки diff, которая выполнила за вас разбор. Но последнее вряд ли стоит усилий.
Вы можете добиться этого, используя атрибуты git и diff фильтры, как описано в Просмотр вывода фильтров git при использовании meld в качестве инструмента сравнения вызвать скрипт sed, который, однако, сам по себе довольно сложен, если вы хотите, чтобы он обрабатывал все случаи, такие как разделители комментариев внутри строковых литералов и т. д.