Git алгоритм diff, который не разделяет функции отдельно? (знание языков)
Можно ли настроить git diff на уважение отступов и синтаксиса?
Я не говорю об игнорировании отступов и пробелов, а вместо того, чтобы использовать пустые строки, уровни отступов и, возможно, скобки, чтобы помочь сопоставить старые строки с новыми строками.
например. git diff часто прорезает функции и их докблоки, например:
class C {
/**
+ * Goes to the bar.
+ */
+ function bar() {
+ return 'bar';
+ }
+
+ /**
* Gets your foo up to date.
*/
function foo() {
Когда я предпочитаю
class C {
+
+ /**
+ * Goes to the bar.
+ */
+ function bar() {
+ return 'bar';
+ }
/**
* Gets your foo up to date.
*/
function foo() {
В этом примере он по-прежнему совершенно безвреден, но есть примеры, когда функции и их docblock действительно разрываются друг от друга из-за жадной и наивной реализации diff.
Примечание. Я уже настроил *.php diff=php
в ~/.gitattributes
.
EDIT: Другой пример:
Здесь git diff смешивает свойство docblock с методом docblock:
/**
- * @var int
+ * @param string $str
*/
Ответы
Ответ 1
Я не знаю, как это сделать только в git, но есть хотя бы один коммерческий инструмент (т.е. он стоит денег), который имеет дело с такими проблемами, называемыми SemanticMerge.
Он может обрабатывать довольно много интересных случаев и поддерживает С#, Java и частично C. Вы можете настроить git для использования в качестве инструмента слияния.
(Я не аффилирован.)