Есть ли инструмент diff (patch), который знает о отступе?
Я регулярно использую патч gnu-utils и diff. Используя git, я часто делаю:
git diff
Часто простые изменения создают большой патч, потому что единственное, что изменилось, это, например, добавление цикла if/else, а все внутри - вправо.
Рассмотрение такого патча может быть громоздким, потому что только линейное сравнение вручную может указывать, изменилось ли что-то в пределах отступающего кода. Мы можем говорить только о нескольких строках кода или о десятках (или многом другом) вложенного кода. (Я знаю: такая гипотетически большая функция лучше будет разбита на более мелкие функции, но это не так).
Невозможно распознать GNU diff/patch, когда единственное изменение в кодовом блоке - это отступ, и пусть разработчик знает столько же?
Существуют ли какие-либо другие средства сравнения, которые работают таким образом?
Изменить: Хорошо, есть --ignore-space-change
, но тогда мы находимся в любой ситуации: либо у нас есть человеко-читаемый патч, либо у нас есть полный патч, который умеют читать. Разве мы не можем иметь лучшее из мира с более сложным инструментом сравнения, который бы отображал изменения человеческого пространства для того, что они делают, позволяя машине полностью применять патч?
Ответы
Ответ 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
Я пытаюсь не выполнять изменения отступов в целом в одном и том же фиксации, как некоторые другие изменения. И я фиксирую изменения отступов в отдельной фиксации до или после, с сообщением фиксации "Только измененный отступ". Чтобы сделать его понятным, чтобы не требовалось ручного контроля дифферента, чтобы увидеть, было ли что-то еще изменено.