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

Java-команда слияния

Каждый раз, когда я вижу конфликт в чем-то вроде импорта или изменения подписи метода (например, переименования переменных) в моем SCM, я задаюсь вопросом, есть ли что-то вроде метода diff/merge, который знает язык, который может обрабатывать более раздражающие небольшие изменения, которые могут происходят по совместному проекту. Есть ли что-нибудь, что обрабатывает конфликты более плавно, работая в среде Unix?

4b9b3361

Ответ 1

Я согласен с тем, что было бы замечательно, если бы такой инструмент существовал, но я не знаю об этом. Причина, по которой я считаю, что их нет, состоит в том, что алгоритм слияния для каждого SCM (будь то git, hg, bzr, svn и т.д.) Работает на самом низком общем знаменателе, который является просто обычным текстом. Чтобы эти инструменты SCM действительно понимали синтаксис и семантику языка, они должны были бы включать в себя способность анализировать язык. Кажется, что это просто слишком большая задача для любого SCM, чтобы включить возможность синтаксического анализа Java, С#, Python, Ruby, Groovy, C, С++ и т.д., Не говоря уже о том, что каждый из этих языков имеет разные синтаксисы между версией (например, Java generics не существовало до 1.5). Таким образом, SCM должен будет включить возможность обнаружения или настройки для определения языка и версии языка, на котором написан исходный код.

Я думаю, что было бы более вероятно, что любая функция слияния, зависящая от языка, будет найдена в инструменте слияния третьей стороны (например, в настройке инструмента слияния в .gitconfig и настройке слияния ui > .hgrc). Этот инструмент можно настроить так, чтобы знать, что любые .java файлы в вашем проекте написаны на Java 1.6, а затем использует функции синтаксического анализа в JDK для генерации AST и выполнить некоторый "глубокий" анализ того, было ли изменение значимым в контексте этого языка.

Ответ 2

Я ищу то же самое. Эти продавцы инструментов слияния должны, вероятно, обращаться к этому семантическому смысловому, языковому слиянию. Если нет, я должен стать одним:)

В настоящее время, как плохой трюк, я иногда обрабатываю 3 файла (базу, наш, их) в их "канонической форме", подавая их через Eclipse Code Cleanup/Organize Imports/Order Members.

Несмотря на ограниченность, это работает хорошо: в последний раз это уменьшало количество конфликтов до ~ 200 в 2. Планируем обернуть это в script и подключиться к средству слияния git.

Также написал script autoresolve java import conflict, который просто удерживает обе стороны импорта и добавляет комментарии, чтобы объяснить, что происходит, и что делать: "организовать импорт".

Ответ 3

не решает проблему git решить эту проблему? любые переменные переименования будут учитываться в связанных фиксациях. git rebase позволяет вам оставаться в синхронизации с восходящими коммитами. до тех пор, пока вы часто переустанавливаете (ежедневно?), вы не должны становиться такими глупыми конфликтами, и если да, то они, вероятно, являются реальными конфликтами и не разрешаются парсером java-грамматики.

Ответ 4

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