Есть ли инструмент сравнения (патч), который знает о отступах? - PullRequest
21 голосов
/ 10 ноября 2010

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

git diff

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

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 10 ноября 2010

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

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

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

2 голосов
/ 20 сентября 2012

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

2 голосов
/ 23 ноября 2010

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

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

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

1 голос
/ 28 января 2015

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

...