Comment gérer les fichiers de projet IntelliJ IDEA sous le contrôle de source Git en constante évolution?

151

Tous les membres de notre équipe utilisent IntelliJ IDEA, et nous trouvons utile de placer ses fichiers de projet (.ipr et .iml) dans le contrôle de code source afin que nous puissions partager les configurations de construction, les paramètres et les inspections. De plus, nous pouvons ensuite utiliser ces paramètres d'inspection sur notre serveur d'intégration continue avec TeamCity. (Nous avons le fichier .iws de l'espace de travail par utilisateur dans le fichier .gitignore et non dans le contrôle de code source.)

Cependant, ces fichiers changent peu lorsque vous faites à peu près n'importe quoi dans IDEA. Il y a un problème dans la base de données des problèmes d' IDEA ( IDEA-64312 ), alors peut-être que l'on pourrait considérer cela comme un bogue dans IDEA, mais c'est un bogue avec lequel nous devrons vivre dans un avenir prévisible.

Jusqu'à récemment, nous utilisions Subversion, mais nous sommes récemment passés à Git. Chacun de nous venait de s'habituer à avoir une liste de modifications de fichiers de projet que nous ignorions et que nous ne archivions pas à moins qu'il y ait des modifications de fichier de projet que nous voulions partager avec d'autres. Mais avec Git, le vrai pouvoir semble être (d'après ce que nous explorons) le branchement continu qu'il encourage, et le basculement entre les branches est une douleur avec les fichiers de projet ayant toujours été modifiés. Souvent, il peut simplement fusionner les modifications d'une manière ou d'une autre et essaie de gérer les modifications du fichier de projet actuellement appliquées à la nouvelle branche. Cependant, si la nouvelle branche a changé les fichiers du projet (par exemple, la branche travaille sur un nouveau module qui n'est pas encore dans les autres branches), git lève simplement une erreur indiquant que ce n'est pas le cas. Cela n'a aucun sens de fusionner les fichiers lorsque la branche a des modifications et que vous avez des modifications localement, et je peux plutôt comprendre son point. Depuis la ligne de commande, on peut utiliser "-f" sur la commande "git checkout" pour le forcer à rejeter les modifications locales et à utiliser la branche à la place, mais (1) la commande Git Checkout GUI dans IDEA (10.5.1) ne semble pas avoir cela comme une option que nous pouvons trouver, nous aurions donc besoin de passer régulièrement à la ligne de commande, et (2) Nous ne sommes pas sûrs de vouloir avoir l'habitude de l'utiliser flag et dire à Git de rejeter nos modifications locales.

Alors, voici quelques réflexions que nous avons sur les options que nous devons gérer:

  1. Retirez complètement les fichiers de projet du contrôle de code source. Mettez-les dans le .gitignore, et distribuez-les à chaque personne et à TeamCity via d'autres moyens, peut-être en les mettant sous contrôle de code source ailleurs ou sous d'autres noms. Notre équipe est suffisamment petite pour que cette option soit suffisamment envisageable, mais cela ne semble pas génial.
  2. Continuez à vivre avec, en essayant d'être sûr de gérer quels fichiers nous avons sur quelles branches à un moment donné. Dans ce cadre, nous pourrions encourager chaque développeur à avoir plus d'une copie de chaque projet sur son système, afin qu'ils puissent avoir chacun extrait dans une branche différente avec éventuellement des ensembles de fichiers de projet différents.
  3. Essayez d'avoir uniquement le projet (.ipr) dans le contrôle de code source, avec les fichiers de module (.iml) pas dans le contrôle de code source et dans le fichier .gitignore. La principale chose qui semble changer régulièrement dans le .ipr est l'ordre des configurations de construction partagées, mais peut-être pouvons-nous simplement partager les informations séparément sur la façon de les configurer. Je ne sais pas trop comment IDEA gère ce genre de chose en ne disposant que de certains de ses fichiers, en particulier lors d'une nouvelle extraction.

J'espère que j'espère qu'il y a une solution évidente (ou non) que nous avons manquée, peut-être traitant de l'énorme personnalisabilité que Git et IDEA semblent tous deux avoir. Mais il semble que nous ne pourrions pas être la seule équipe à avoir ce problème. Les questions qui sont un peu similaires sur Stack Overflow incluent 3495191 , 1000512 et 3873872 , mais je ne sais pas car il s'agit exactement du même problème, et peut-être que quelqu'un peut trouver les avantages et les inconvénients des différentes approches que j'ai décrites, les approches énumérées dans les réponses à ces questions, ou les approches qu'ils recommandent.

Serrement
la source
Réponse ci-dessous à condition que gitignore.io soit une bonne base. Je l'ai trouvé utile, même si trois ans après les faits: gitignore.io/api/java,android,eclipse,intellij
WernerCD
Notez que le problème IDEA youtrack.jetbrains.com/issue/IDEA-64312 que j'ai mentionné est marqué comme résolu dans IntelliJ IDEA 14, de sorte que ceux qui utilisent la dernière version et souhaitent conserver les fichiers sous contrôle de code source peuvent avoir un meilleur moment maintenant. qu'au moment où j'ai posté cette question.

Réponses:

48

Vous pouvez utiliser la structure de projet basée sur les répertoires d'IDEA , où les paramètres sont stockés dans le répertoire .idea au lieu du fichier .ipr. Il donne un contrôle plus fin sur ce qui est stocké dans le contrôle de version. Les fichiers .iml seront toujours là, donc cela ne résout pas les changements aléatoires qu'ils contiennent (peut-être les garder hors du contrôle de source?), Mais partager des éléments tels que le style de code et les profils d'inspection est facile, car chacun d'eux sera dans son propre fichier sous le répertoire .idea.

Esko Luontola
la source
Le passage à la structure basée sur des répertoires a certainement beaucoup aidé. Nous avons retiré les fichiers .iml du contrôle de code source, ce qui rend IDEA un peu confus lors de la première vérification, mais cela semble être le meilleur compromis pour le moment. Nous devions également faire fonctionner les inspections TeamCity à partir du fichier Maven et d'un profil d'inspection exporté, mais nous l'avons également fait fonctionner. Je vous remercie!
Le lien est rompu. Je ne sais pas quel était le contenu original, mais voici un lien vers un document pertinent sur la structure du projet d'IDEA. Et voici un autre lien traitant de cette question spécifique.
Ben 12
31

Du DOC officiel: http://devnet.jetbrains.com/docs/DOC-1186

Selon le format du projet IntelliJ IDEA (basé sur un fichier .ipr ou sur un répertoire .idea), vous devez placer les fichiers de projet IntelliJ IDEA suivants sous le contrôle de version:

Format basé sur un fichier .ipr

Partagez le fichier .ipr du projet et tous les fichiers du module .iml, ne partagez pas le fichier .iws car il stocke les paramètres spécifiques à l'utilisateur.

Format basé sur le répertoire .idea

Partagez tous les fichiers sous le répertoire .idea à la racine du projet, à l'exception des fichiers workspace.xml et tasks.xml qui stockent les paramètres spécifiques à l'utilisateur, partagent également tous les fichiers du module .iml.

Je l'ai mis dans mon .gitignore:

#Project
workspace.xml
tasks.xml
Felipe
la source
8
Oui, et comme je l'ai dit dans la question, nous avons partagé les .ipr et .iml et non les .iws. Le problème est le problème dans youtrack.jetbrains.com/issue/IDEA-64312 que les fichiers .iml changent tout le temps, ce qui entraîne de fréquents conflits. Garder les fichiers .iml hors du contrôle de code source semble mieux fonctionner pour nous, car IDEA les régénère à partir du Maven POM, et ils peuvent ensuite continuer à changer localement sans conflits avec d'autres développeurs. Merci!
Avec cette approche, nous avons des problèmes avec certains noms de ressources, par exemple: les versions Android JDK. Certains membres de notre équipe ont des noms différents ou des versions différentes d'un SDK configuré. En envoyant des fichiers de projet au dépôt, vous devez aligner ce genre de choses avec votre équipe. Jusqu'à hier, nous n'avions pas l'habitude d'envoyer des fichiers proj au repo, mais cela devenait difficile car notre projet devenait gros et difficile à configurer.
Felipe
Unifier les SDK utilisés et les chemins relatifs est la solution simple et efficace
Kumait
1
Oui. Désormais, tous nos modules pointent vers "Project SDK", et nous nous alignons avec l'équipe pour utiliser le même SDK. Au moins est juste un endroit à modifier. Mais IntelliJ pourrait faire mieux.
Felipe
23

Une réponse officielle est disponible . En supposant que vous utilisez le .ideaformat de projet de dossier moderne (et maintenant par défaut) :

  • Tout ajouter ...
  • Sauf .idea/workspace.xml(qui est spécifique à l'utilisateur)
  • Sauf .idea/tasks.xml(qui est spécifique à l'utilisateur)
  • Sauf quelques autres fichiers qui peuvent contenir des mots de passe / clés / etc (voir le lien ci-dessus pour plus de détails)

Cet exemple de fichier .gitignore peut être une référence utile, mais vous devriez toujours lire le lien ci-dessus pour comprendre pourquoi ces entrées apparaissent et décider si vous en avez besoin.

Personnellement, j'ignore également le .idea/find.xmlfichier car cela semble changer à chaque fois que vous effectuez une opération de recherche.

Drew Noakes
la source
1
basé sur le lien "sample gitignore file", je voudrais aller plus loin et je suis heureux que vous l'ayez fourni. allez à l'adresse basée et vous pouvez combiner différents types pour obtenir un gitignore "complet". Pour mon projet Android, qui utilise évidemment Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD
16

J'ai pris workspace.xml hors du contrôle de code source (+ ajouté à .gitignore).

ripper234
la source
10

Notre équipe n'enregistre pas les fichiers IntelliJ spécifiques aux chemins. Nous supposons que les gens savent comment utiliser l'EDI et mettre en place un projet. Les fichiers IntelliJ vont dans la liste des modifications «ignorées».

METTRE À JOUR:

La réponse est plus simple maintenant que j'utilise Maven et sa structure de répertoires par défaut.

IntelliJ devrait être invité à ignorer tous les fichiers /.svn, /.ideaet des /targetdossiers. Tout ce qui concerne les informations sur le chemin d'un individu est stocké dans /.idea.

Tout le reste est juste pour être engagé dans Subversion ou Git.

duffymo
la source
14
La configuration du projet n'est pas un gros problème car cela n'arrive pas souvent, mais il est très pratique de pouvoir partager des configurations de construction et des profils d'inspection sans avoir besoin d'envoyer des captures d'écran par courrier électronique ou quelque chose du genre.
1
Enregistrez les éléments qui ne dépendent pas du chemin d'un individu.
duffymo
2

Juste pour partager une autre approche que mon équipe a utilisée: déplacez simplement les fichiers liés à l'IDE vers un emplacement différent qu'IntelliJ ne reconnaît pas, et créez un script pour les copier vers l'emplacement `` actif '' souhaité qui est ignoré par GIT.

L'avantage de cette approche est que vous avez conservé la possibilité de partager les paramètres IDE via le contrôle de version. Le seul inconvénient est que vous devez décider quand exécuter le script (probablement une fois par clone d'espace de travail ou lorsque des modifications sont souhaitées), et vous pouvez automatiser cela en incorporant le script dans votre processus de construction ou votre hook post-fusion.

Cette approche repose sur le fait qu'IntelliJ ne recherche que des emplacements particuliers pour ses fichiers de paramètres, de sorte qu'elle s'applique également aux fichiers de configuration de l'infrastructure. En fait, nous avons ignoré le fichier .properties Grails de la même manière, afin que les développeurs n'inscrivent pas accidentellement leurs modifications de configuration locale.

Shawn
la source