¿Cómo lidiar con los archivos de proyecto IntelliJ IDEA bajo control de fuente Git en constante cambio?

151

Todos en nuestro equipo usan IntelliJ IDEA, y nos resulta útil poner sus archivos de proyecto (.ipr y .iml) en el control de origen para que podamos compartir configuraciones, configuraciones e inspecciones de compilación. Además, podemos usar esas configuraciones de inspección en nuestro servidor de integración continua con TeamCity. (Tenemos el archivo .iws del espacio de trabajo por usuario en el archivo .gitignore y no en el control de origen).

Sin embargo, esos archivos cambian en pequeñas formas cuando haces casi cualquier cosa en IDEA. Hay un problema en la base de datos de problemas de IDEA ( IDEA-64312 ), por lo que tal vez uno podría considerar esto un error en IDEA, pero es uno con el que tendremos que vivir en el futuro previsible.

Hasta hace poco, estábamos usando Subversion, pero recientemente cambiamos a Git. Cada uno de nosotros nos habíamos acostumbrado a tener una lista de cambios de archivos de proyectos que ignoramos y no registramos a menos que hubiera cambios en los archivos de proyectos que quisiéramos compartir con otros. Pero con Git, el verdadero poder parece ser (por lo que estamos explorando) la ramificación continua que fomenta, y cambiar entre ramas es una molestia ya que los archivos del proyecto siempre se han modificado. A menudo, puede fusionarse de alguna manera en los cambios e intenta lidiar con los cambios en el archivo del proyecto que ahora se aplican a la nueva rama. Sin embargo, si la nueva rama ha cambiado los archivos del proyecto (como que la rama está trabajando en un nuevo módulo que aún no está en las otras ramas), git solo arroja un error que no No tiene ningún sentido fusionarse en los archivos cuando tanto la rama tiene cambios como usted tiene cambios localmente, y puedo entender su punto. Desde la línea de comando, se puede usar "-f" en el comando "git checkout" para forzarlo a descartar los cambios locales y usar la rama en su lugar, pero (1) el comando Git Checkout GUI en IDEA (10.5.1) no parece tener eso como una opción que podamos encontrar, por lo que tendríamos que cambiar a la línea de comando de forma regular, y (2) No estamos seguros de querer tener el hábito de usar eso bandera y decirle a Git que descarte nuestros cambios locales.

Entonces, aquí hay algunas ideas que tenemos sobre las opciones que tenemos para lidiar con esto:

  1. Elimine completamente los archivos del proyecto del control de origen. Póngalos en .gitignore y distribúyalos a cada persona y TeamCity por algún otro medio, tal vez poniéndolos en el control de la fuente en otro lugar o bajo otros nombres. Nuestro equipo es lo suficientemente pequeño como para considerar esta opción, pero no parece excelente.
  2. Continúe viviendo con él, tratando de asegurarse de administrar qué archivos tenemos en qué ramas en un momento dado. Como parte de esto, podríamos alentar a cada desarrollador a que tenga más de una copia de cada proyecto en su sistema, para que puedan verificarse en una rama diferente con posiblemente diferentes conjuntos de archivos de proyecto.
  3. Intente tener solo el proyecto (.ipr) en el control de origen, con los archivos del módulo (.iml) no en el control de origen y en el archivo .gitignore. Lo principal que parece cambiar por sí solo en el .ipr de forma regular es el orden de las configuraciones de compilación compartidas, pero tal vez solo podamos compartir la información por separado sobre cómo configurarlas. Sin embargo, no estoy muy seguro de cómo IDEA se ocupa de este tipo de cosas de tener solo algunos de sus archivos, especialmente en un nuevo pago.

Supongo que espero que haya una solución obvia (o no obvia) que nos hemos perdido, tal vez lidiando con la enorme personalización que Git e IDEA parecen tener. Pero parece que no podríamos ser el único equipo que tiene este problema. Las preguntas que son algo similares en Stack Overflow incluyen 3495191 , 1000512 y 3873872 , pero no sé, ya que son exactamente el mismo problema, y ​​tal vez alguien pueda proponer los pros y los contras de los diversos enfoques que he descritos, los enfoques enumerados en las respuestas a esas preguntas, o los enfoques que recomiendan.

Angustia
fuente
La respuesta a continuación proporcionó gitignore.io como una buena base. Lo encontré útil, incluso tres años después del hecho: gitignore.io/api/java,android,eclipse,intellij
WernerCD
Tenga en cuenta que el problema IDEA youtrack.jetbrains.com/issue/IDEA-64312 que mencioné está marcado como solucionado en IntelliJ IDEA 14, por lo que aquellos que usan la última versión y desean mantener los archivos en el control de origen pueden tener un mejor momento ahora que en el momento en que publiqué esta pregunta.

Respuestas:

48

Puede usar la estructura de proyecto basada en directorios de IDEA , donde la configuración se almacena en el directorio .idea en lugar del archivo .ipr. Ofrece un control más detallado sobre lo que está almacenado en el control de versiones. Los archivos .iml seguirán existiendo, por lo que no resuelve los cambios aleatorios en ellos (¿tal vez los mantenga fuera del control de origen?), Pero compartir cosas como el estilo de código y los perfiles de inspección es fácil, ya que cada uno de ellos será en su propio archivo bajo el directorio .idea.

Esko Luontola
fuente
Pasar a la estructura basada en directorios definitivamente ayudó mucho. Eliminamos los archivos .iml del control de código fuente, lo que hace que IDEA esté un poco confundida cuando se retira por primera vez, pero parece el mejor compromiso por ahora. También tuvimos que hacer que las inspecciones de TeamCity funcionaran desde el archivo Maven y un perfil de inspecciones exportado, pero también lo hicimos funcionar. ¡Gracias!
El enlace está roto. No estoy seguro de cuál era el contenido original, pero aquí hay un enlace a un documento relevante sobre la estructura del proyecto de IDEA. Y aquí hay otro enlace que trata este problema específico.
Ben.12
31

Del DOC oficial: http://devnet.jetbrains.com/docs/DOC-1186

Dependiendo del formato del proyecto IntelliJ IDEA (basado en el archivo .ipr o basado en el directorio .idea), debe colocar los siguientes archivos del proyecto IntelliJ IDEA bajo el control de versión:

formato basado en archivos .ipr

Comparta el archivo .ipr del proyecto y todos los archivos del módulo .iml, no comparta el archivo .iws ya que almacena configuraciones específicas del usuario.

Formato basado en el directorio .idea

Comparta todos los archivos en el directorio .idea en la raíz del proyecto, excepto los archivos workspace.xml y task.xml que almacenan configuraciones específicas del usuario, también comparta todos los archivos del módulo .iml.

Lo puse en mi .gitignore:

#Project
workspace.xml
tasks.xml
Felipe
fuente
8
Sí, y como dije en la pregunta, compartimos el .ipr y .iml y no los .iws. El problema es el problema en youtrack.jetbrains.com/issue/IDEA-64312 de que los archivos .iml cambian todo el tiempo, lo que genera conflictos frecuentes. Mantener los archivos .iml fuera del control de la fuente parece funcionar mejor para nosotros, ya que IDEA los regenera del Maven POM, y luego pueden seguir cambiando localmente sin conflictos con otros desarrolladores. ¡Gracias!
Con este enfoque, tenemos problemas con algunos nombres de recursos, por ejemplo: versiones de Android JDK. Algunos de los miembros de nuestro equipo tienen diferentes nombres o diferentes versiones para un SDK configurado. Para enviar archivos de proyecto al repositorio, debe alinear ese tipo de cosas con su equipo. Hasta ayer no estábamos acostumbrados a enviar archivos de proyecto a repositorio, pero se hizo difícil porque nuestro proyecto se hizo grande y difícil de configurar.
Felipe
Unificar los SDK usados ​​y las rutas relativas es la solución simple y efectiva
Kumait
1
Si. Ahora todos nuestros módulos apuntan a "Project SDK", y nos alineamos con el equipo para usar el mismo SDK. Al menos es solo un lugar para modificar. Pero IntelliJ podría hacerlo mejor.
Felipe
23

Una respuesta oficial está disponible . Suponiendo que está utilizando el .ideaformato de proyecto de carpeta moderno (y ahora predeterminado) :

  • Agrega todo ...
  • Excepto .idea/workspace.xml(que es específico del usuario)
  • Excepto .idea/tasks.xml(que es específico del usuario)
  • Excepto algunos otros archivos que pueden contener contraseñas / claves / etc. (vea el enlace de arriba para más detalles)

Este archivo .gitignore de muestra puede ser una referencia útil, aunque aún debe leer el enlace anterior para comprender por qué aparecen estas entradas y decidir si las necesita.

Personalmente, también ignoro el .idea/find.xmlarchivo, ya que parece cambiar cada vez que realiza una operación de búsqueda.

Drew Noakes
fuente
1
basado en el enlace "ejemplo de archivo gitignore", iría un paso más allá y me alegra que lo haya proporcionado. vaya a la dirección basada y puede combinar diferentes tipos para obtener un gitignore "completo". Para mi proyecto de Android, que utiliza, obviamente, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD
16

Tomé workspace.xml fuera del control de código fuente (+ agregado a .gitignore).

ripper234
fuente
10

Nuestro equipo no registra los archivos IntelliJ específicos de la ruta. Asumimos que las personas saben cómo usar el IDE y configurar un proyecto. Los archivos IntelliJ entran en la lista de cambios 'ignorados'.

ACTUALIZAR:

La respuesta es más fácil ahora que estoy usando Maven y su estructura de directorios predeterminada.

IntelliJ se debe pedir a ignorar todos los archivos /.svn, /.ideay /targetcarpetas. Todo lo que pertenece a la información de ruta de un individuo se almacena en /.idea.

Todo lo demás es un juego justo para comprometerse con Subversion o Git.

duffymo
fuente
14
Configurar el proyecto no es un gran problema, ya que no sucede a menudo, pero es muy útil poder compartir configuraciones de compilación y perfiles de inspección sin necesidad de enviar por correo electrónico capturas de pantalla o algo así.
1
Verifique las cosas que no dependen de la ruta de un individuo.
duffymo
2

Solo para compartir otro enfoque que mi equipo ha utilizado: simplemente mueva los archivos relacionados con IDE a una ubicación diferente donde IntelliJ no reconozca, y cree un script para copiarlos a la ubicación 'activa' deseada que GIT ignora.

El beneficio de este enfoque es que mantuvo la opción de compartir la configuración IDE a través del control de versiones. El único inconveniente es que tiene que decidir cuándo ejecutar el script (probablemente una vez por clon del espacio de trabajo o cuándo se desean cambios), y puede automatizar esto incorporando el script en su proceso de compilación o enlace posterior a la fusión.

Este enfoque se basa en que IntelliJ busca solo ubicaciones particulares para sus archivos de configuración, por lo que también se aplica con los archivos de configuración del marco. En realidad, ignoramos el archivo .properties de Grails de la misma manera, por lo que los desarrolladores no registrarán accidentalmente sus cambios de configuración local.

Shawn
fuente