Как работать с файлами проектов IntelliJ IDEA в системе контроля версий Git, которые постоянно меняются?

151

Каждый в нашей команде использует IntelliJ IDEA, и мы считаем полезным поместить его файлы проекта (.ipr и .iml) в систему контроля версий, чтобы мы могли обмениваться конфигурациями, настройками и проверками сборки. Кроме того, мы можем использовать эти параметры проверки на нашем сервере непрерывной интеграции с TeamCity. (У нас есть файл .iws рабочей области для пользователя в файле .gitignore, а не в системе контроля версий.)

Однако эти файлы меняются незначительно, когда вы делаете что-либо в IDEA. Для этого существует проблема в базе данных проблем IDEA ( IDEA-64312 ), поэтому, возможно, можно считать это ошибкой в ​​IDEA, но с ней нам придется смириться в обозримом будущем.

До недавнего времени мы использовали Subversion, но недавно перешли на Git. Каждый из нас привык к тому, что у нас есть список изменений файлов проекта, который мы игнорировали и не регистрировали, если не было изменений файла проекта, которыми мы хотели поделиться с другими. Но с Git реальная сила, кажется, (из того, что мы исследуем) - это непрерывное ветвление, которое оно поощряет, и переключение между ветвями - это проблема с файлами проекта, которые всегда модифицировались. Часто он может просто каким-то образом объединить изменения и попытаться справиться с изменениями файла проекта, которые теперь применяются к новой ветви. Однако, если новая ветвь изменила файлы проекта (например, ветвь работает над новым модулем, которого пока нет в других ветвях), git просто выдаст ошибку, которую он не ' Не имеет никакого смысла объединять файлы, когда обе ветви имеют изменения, и у вас есть изменения локально, и я могу лучше понять его смысл. Из командной строки можно использовать «-f» в команде «git checkout», чтобы заставить ее выбрасывать локальные изменения и использовать вместо этого ветки, но (1) команду Git Checkout GUI в IDEA (10.5.1) Похоже, что это не вариант, который мы можем найти, поэтому нам нужно было бы регулярно переключаться на командную строку, и (2) мы не уверены, что хотим использовать эту привычку флаг и говорит Git выбросить наши локальные изменения.

Итак, вот некоторые мысли, которые у нас есть по поводу вариантов, с которыми мы должны иметь дело:

  1. Вывести файлы проекта из-под контроля исходного кода полностью. Поместите их в .gitignore и раздайте их каждому человеку и TeamCity с помощью других средств, возможно, поместив их в систему контроля версий где-либо еще или под другими именами. Наша команда достаточно мала, и этот вариант достаточно выполним, чтобы рассмотреть, но он не кажется отличным.
  2. Продолжайте жить с этим, стараясь быть уверенными в том, какие файлы и ветки у нас есть в данный момент времени. В рамках этого мы могли бы рекомендовать каждому разработчику иметь более одной копии каждого проекта в своей системе, чтобы они могли получить каждый извлеченный файл в другой ветви с возможно разными наборами файлов проекта.
  3. Попробуйте использовать только проект (.ipr) в системе контроля версий, а файлы модуля (.iml) не в системе управления версиями, а в файле .gitignore. Кажется, что главное, что само по себе регулярно переключается в .ipr, это порядок общих конфигураций сборки, но, возможно, мы можем просто поделиться информацией отдельно о том, как их настроить. Я не совсем уверен, как IDEA справляется с такого рода вещами, имея только некоторые из своих файлов, особенно на новой кассе.

Думаю, я надеюсь, что есть какое-то очевидное (или неочевидное) решение, которое мы упустили, возможно, имеющее дело с огромной настраиваемостью, которую, похоже, имеют Git и IDEA. Но похоже, что мы не могли быть единственной командой, имеющей эту проблему. Вопросы, которые похожи на переполнение стека, включают 3495191 , 1000512 и 3873872 , но я не знаю, так как они абсолютно одинаковые, и, возможно, кто-то может придумать плюсы и минусы для различных подходов, которые я изложены, подходы, перечисленные в ответах на эти вопросы, или подходы, которые они рекомендуют.

острая боль
источник
2
см. stackoverflow.com/questions/3041154/… -> FAQ по IDEA: devnet.jetbrains.com/docs/DOC-1186
Мэттью Корнелл,
Ответ ниже предоставлен gitignore.io в качестве хорошей базы. Я нашел это полезным, даже если через три года после этого факта: gitignore.io/api/java,android,eclipse,intellij
WernerCD
Обратите внимание, что проблема IDEA youtrack.jetbrains.com/issue/IDEA-64312, о которой я упоминал, помечена как исправленная в IntelliJ IDEA 14, поэтому те, кто использует последнюю версию и хотят сохранить файлы в системе контроля версий, могут лучше ее решить сейчас чем в тот момент, когда я разместил этот вопрос.

Ответы:

48

Вы можете использовать структуру проекта IDEA на основе каталогов , где настройки хранятся в каталоге .idea, а не в файле .ipr. Это дает более детальный контроль над тем, что хранится в контроле версий. Файлы .iml по-прежнему будут присутствовать, поэтому они не решают случайные изменения в них (возможно, не допускают их контроля над исходным кодом?), Но совместное использование таких вещей, как стиль кода и профили проверки, является простым, поскольку каждый из них будет в своем собственном файле в каталоге .idea.

Эско Луонтола
источник
Переход на структуру каталогов определенно очень помог. Мы вывели файлы .iml из-под контроля исходного кода, что делает IDEA немного запутанным при первой проверке, но пока это кажется лучшим компромиссом. Нам также нужно было, чтобы инспекция TeamCity работала с файлом Maven и экспортированным профилем инспекций, но у нас это тоже получилось. Спасибо!
Ссылка не работает. Не уверен, каким был исходный контент, но здесь есть ссылка на соответствующий документ по структуре проекта IDEA. А вот еще одна ссылка, посвященная этой конкретной проблеме.
Ben.12
31

Из официального документа DOC: http://devnet.jetbrains.com/docs/DOC-1186.

В зависимости от формата проекта IntelliJ IDEA (на основе файла .ipr или каталога .idea), вы должны поместить следующие файлы проекта IntelliJ IDEA под контроль версий:

Формат файла .ipr

Разделяйте файл проекта .ipr и все файлы модуля .iml, не делитесь файлом .iws, поскольку он хранит пользовательские настройки.

Формат на основе каталога .idea

Совместно используйте все файлы в каталоге .idea в корневом каталоге проекта, кроме файлов workspace.xml и tasks.xml, в которых хранятся пользовательские настройки, а также все файлы модуля .iml.

Я положил это в мой .gitignore:

#Project
workspace.xml
tasks.xml
Фелипе
источник
8
Да, и, как я уже сказал в этом вопросе, мы разделили .ipr и .iml, а не .iws. Проблема в том, что на youtrack.jetbrains.com/issue/IDEA-64312 файлы .iml постоянно меняются, что приводит к частым конфликтам. Нам кажется, что лучше сохранить файлы .iml вне системы контроля версий, поскольку IDEA регенерирует их из POM Maven, и тогда они могут просто продолжать локальные изменения без конфликтов с другими разработчиками. Спасибо!
При таком подходе у нас возникают проблемы с некоторыми именами ресурсов, например: версиями Android JDK. Некоторые из членов нашей команды имеют разные имена или разные версии для настроенного SDK. Отправляя файлы проекта в репо, вы должны согласовать подобные вещи с вашей командой. До вчерашнего дня мы не использовались для отправки proj-файлов в репо, но это стало сложно, потому что наш проект стал большим и сложным в настройке.
Фелипе
Объединение используемых SDK и относительных путей - простое и эффективное решение
Kumait
1
Да. Теперь все наши модули указывают на «Project SDK», и мы согласовываем с командой использование того же SDK. По крайней мере, это только одно место, чтобы изменить. Но IntelliJ мог бы сделать это лучше.
Фелипе
23

Официальный ответ доступен . Предполагая, что вы используете современный (и теперь используемый по умолчанию) .ideaформат проекта папки:

  • Добавить все ...
  • За исключением .idea/workspace.xml(который зависит от пользователя)
  • За исключением .idea/tasks.xml(который зависит от пользователя)
  • За исключением некоторых других файлов, которые могут содержать пароли / ключи / и т. Д. (Подробности см. Выше)

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

Лично я также игнорирую .idea/find.xmlфайл, так как он, кажется, меняется каждый раз, когда вы выполняете операцию поиска.

Дрю Ноакс
источник
1
основываясь на ссылке «пример файла gitignore», я бы сделал еще один шаг и рад, что вы предоставили это. перейдите на базовый адрес, и вы можете комбинировать различные типы, чтобы получить «полный» gitignore. Для моего проекта Android, который использует, очевидно, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD
16

Я взял workspace.xml из системы контроля версий (+ добавлен в .gitignore).

ripper234
источник
10

Наша команда не регистрирует файлы IntelliJ для конкретных путей. Мы предполагаем, что люди знают, как использовать IDE и настроить проект. Файлы IntelliJ попадают в список игнорируемых изменений.

ОБНОВИТЬ:

Теперь ответ проще, когда я использую Maven и его структуру каталогов по умолчанию.

IntelliJ следует попросить , чтобы игнорировать все файлы /.svn, /.ideaи /targetпапки. Все, что относится к индивидуальной информации о пути, хранится в /.idea.

Все остальное - это честная игра, которую можно посвятить Subversion или Git.

duffymo
источник
14
Настройка проекта не имеет большого значения, так как это происходит не часто, но очень удобно иметь возможность обмениваться конфигурациями конфигурации и профилями проверок без необходимости присылать скриншоты по электронной почте или что-то в этом роде.
1
Проверьте вещи, которые не зависят от индивидуального пути.
duffymo
2

Просто чтобы поделиться другим подходом, использованным моей командой: просто переместите любые связанные с IDE файлы в другое место, где IntelliJ не распознает, и создайте сценарий, чтобы скопировать их в желаемое «активное» место, которое игнорируется GIT.

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

Этот подход основан на том, что IntelliJ выполняет поиск файлов настроек только в определенных местах, поэтому он применяется и к файлам конфигурации платформы. Фактически мы игнорировали файл .properties Grails таким образом, чтобы разработчики не могли случайно зафиксировать свои локальные изменения конфигурации.

Шон
источник