Подтвердить что ты не робот

Есть ли инструмент diff (patch), который знает о отступе?

Я регулярно использую патч gnu-utils и diff. Используя git, я часто делаю:

git diff

Часто простые изменения создают большой патч, потому что единственное, что изменилось, это, например, добавление цикла if/else, а все внутри - вправо.

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

Невозможно распознать GNU diff/patch, когда единственное изменение в кодовом блоке - это отступ, и пусть разработчик знает столько же?

Существуют ли какие-либо другие средства сравнения, которые работают таким образом?

Изменить: Хорошо, есть --ignore-space-change, но тогда мы находимся в любой ситуации: либо у нас есть человеко-читаемый патч, либо у нас есть полный патч, который умеют читать. Разве мы не можем иметь лучшее из мира с более сложным инструментом сравнения, который бы отображал изменения человеческого пространства для того, что они делают, позволяя машине полностью применять патч?

4b9b3361

Ответ 1

С GNU diff вы можете передать -b или --ignore-space-change, чтобы игнорировать изменения в размере пробелов в патче.

Если вы используете emacs и отправили патч, вы также можете использовать M-x diff-ignore-whitespace-hunk для переформатирования патча, чтобы игнорировать пустое пространство в конкретном куске. Или diff-refine-hunk, чтобы выделить изменения в символе по уровню персонажа, который имеет тенденцию указывать "мясо" изменения.

Что касается применения патчей, вы можете использовать -l или --ignore-whitespace с патчем GNU для игнорирования изменений вкладок и пробелов. Просто будьте осторожны с кодом Python: -)

Ответ 2

Я не знаю о git diff. Но инструмент, похожий на diff, который понимает не только отступы, но на самом деле любые изменения макета на вашем целевом языке - это Smart Differencer.

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

Результатом является отчет с точки зрения действий по редактированию программиста ( "перемещать, вставлять, удалять, копировать, переименовывать" ) по языковым структурам (выражениям, операторам, объявлениям, блокам, методам...), а не "вставлять строки", или "удалить строку".

Ответ 3

Для чего стоит использовать git diffftool с помощью инструмента, такого как meld или xxdiff, делает diff более читаемым.

Ответ 4

Я пытаюсь не выполнять изменения отступов в целом в одном и том же фиксации, как некоторые другие изменения. И я фиксирую изменения отступов в отдельной фиксации до или после, с сообщением фиксации "Только измененный отступ". Чтобы сделать его понятным, чтобы не требовалось ручного контроля дифферента, чтобы увидеть, было ли что-то еще изменено.