Как работать с файлами проектов 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 , но я не знаю, так как они абсолютно одинаковые, и, возможно, кто-то может придумать плюсы и минусы для различных подходов, которые я изложены, подходы, перечисленные в ответах на эти вопросы, или подходы, которые они рекомендуют.



Ответ ниже предоставлен 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).


10

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

ОБНОВИТЬ:

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

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

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


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

1
Проверьте вещи, которые не зависят от индивидуального пути.
duffymo

2

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.