Как я могу найти добавленные строки (не измененные) с помощью git diff?

#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:

К сожалению, я не смог найти никакого удовлетворительного ответа (ни здесь, ни где-либо еще), поэтому мне пришлось написать необходимый скрипт самостоятельно.