#git
#git
Вопрос:
У меня есть текстовый файл журнала изменений в проекте. Я хочу получить список изменений из этого файла между двумя тегами. Я подготовил эту команду:
git diff tag1..tag2 file | grep -v -e " b/file" -e "@@" | grep " "
В качестве выходных данных я получаю все строки, помеченные как добавленные (начиная с
). Но между ними могут быть некоторые строки, существовавшие ранее, но измененные между упомянутыми тегами (например, исправленные орфографические ошибки). Есть ли какая-либо опция, которая позволяет фильтровать только новые строки или только измененные строки? Или, может быть, любая опция, которая позволяет контролировать% условие модификации строки для печати в выходных данных?
Комментарии:
1. Как я знаю, git помечает измененные строки как удаленную старую строку и добавляет новую. Нет индикатора строки «изменено». Хотя вы можете видеть, какие удаленные и добавленные строки имеют один и тот же номер строки.
2. Звучит сложно. Что вы хотите, чтобы произошло со строками, которые были перемещены в файле, но не изменены?
3. Эти строки были бы в другом месте файла, поэтому я бы рассматривал их как новые строки.
Ответ №1:
Git не делает этого сам, и это сложная проблема в целом, если вы заботитесь о семантике, а не о простом синтаксисе. Однако Git поставляется с фильтром постобработки под названием diff-highlight
. Код внутри этого Perl-скрипта выполняет интересующий вас синтаксический анализ, поэтому его можно модифицировать, чтобы получить то, что вы хотите.
Смотрите https://github.com/git/git/tree/master/contrib/diff-highlight чтобы отличить источник- выделите. Прочитайте README, чтобы увидеть их заметки о семантических проблемах, связанных с такого рода анализом. Обратите внимание, что начиная с версии 2.9 Git, скрипт highlight устанавливается вместе с остальной частью Git, так что вам не нужно выуживать его из области внесенных источников.
Ответ №2:
К сожалению, я не смог найти никакого удовлетворительного ответа (ни здесь, ни где-либо еще), поэтому мне пришлось написать необходимый скрипт самостоятельно.