Come gestire i file di progetto IDEA di IntelliJ sotto il controllo del codice sorgente Git in continua evoluzione?


151

Tutti nel nostro team utilizzano IntelliJ IDEA e riteniamo utile mettere i propri file di progetto (.ipr e .iml) nel controllo del codice sorgente in modo da poter condividere configurazioni, impostazioni e ispezioni. Inoltre, possiamo utilizzare tali impostazioni di ispezione sul nostro server di integrazione continua con TeamCity. (Abbiamo il file .iws dell'area di lavoro per utente nel file .gitignore e non nel controllo del codice sorgente.)

Tuttavia, quei file cambiano in modo modesto quando fai qualsiasi cosa in IDEA. C'è un problema nel database dei problemi di IDEA ( IDEA-64312 ), quindi forse uno potrebbe considerarlo un bug in IDEA, ma è uno che dovremo convivere per il prossimo futuro.

Fino a poco tempo fa utilizzavamo Subversion, ma recentemente siamo passati a Git. Ci eravamo appena abituati ad avere un elenco di modifiche dei file di progetto che abbiamo ignorato e non abbiamo effettuato il check-in a meno che non ci fossero modifiche ai file di progetto che volevamo condividere con altri. Ma con Git, il vero potere sembra essere (da quello che stiamo esplorando) il continuo dirottamento che incoraggia, e il passaggio tra i rami è un problema con i file di progetto che sono sempre stati modificati. Spesso può semplicemente unire le modifiche in qualche modo e cerca di gestire le modifiche ai file di progetto che ora vengono applicate al nuovo ramo. Tuttavia, se il nuovo ramo ha cambiato i file di progetto (come il ramo sta funzionando su un nuovo modulo che non si trova ancora negli altri rami), git genera un errore che non Non ha alcun senso unire i file quando entrambi i rami hanno delle modifiche e tu hai delle modifiche localmente, e posso piuttosto comprenderne il punto. Dalla riga di comando, è possibile utilizzare "-f" sul comando "git checkout" per forzarlo a eliminare le modifiche locali e utilizzare invece le diramazioni, ma (1) il comando Git Checkout GUI in IDEA (10.5.1) non sembra averlo come un'opzione che possiamo trovare, quindi dovremmo passare alla riga di comando su base regolare e (2) non siamo sicuri di voler prendere l'abitudine di usarlo bandiera e dicendo a Git di eliminare i nostri cambiamenti locali.

Quindi, ecco alcuni pensieri che abbiamo sulle opzioni che dobbiamo affrontare:

  1. Elimina completamente i file di progetto dal controllo del codice sorgente. Inseriscili in .gitignore e distribuiscili a ogni persona e TeamCity in altri modi, magari inserendoli nel controllo del codice sorgente da qualche altra parte o con altri nomi. Il nostro team è abbastanza piccolo questa opzione è abbastanza fattibile da considerare, ma non sembra eccezionale.
  2. Continua a conviverci, cercando di essere sicuro di gestire quali file abbiamo su quali rami in un determinato momento. Come parte di questo, potremmo incoraggiare ogni sviluppatore ad avere più di una copia di ciascun progetto sul proprio sistema, in modo che possano aver fatto il check-out in un ramo diverso con possibilmente diversi set di file di progetto.
  3. Prova ad avere solo il progetto (.ipr) nel controllo del codice sorgente, con i file del modulo (.iml) non nel controllo del codice sorgente e nel file .gitignore. La cosa principale che sembra cambiare da sola nel .ipr su base regolare è l'ordine delle configurazioni di build condivise, ma forse possiamo semplicemente condividere le informazioni separatamente su come impostarle. Non sono del tutto sicuro di come IDEA affronti questo genere di cose solo con alcuni dei suoi file, specialmente in un nuovo checkout.

Immagino di sperare che ci sia qualche soluzione ovvia (o non ovvia) che ci siamo persi, forse affrontando l'enorme personalizzazione che entrambi sembrano avere Git e IDEA. Ma sembra che non potremmo essere l'unica squadra che ha questo problema. Le domande che sono simili in Stack Overflow includono 3495191 , 1000512 e 3873872 , ma non so perché sono esattamente lo stesso problema e forse qualcuno può inventare i pro e i contro per i vari approcci che ho delineato, approcci elencati nelle risposte a tali domande o approcci che raccomandano.



La risposta di seguito ha fornito gitignore.io come una buona base. L'ho trovato utile, anche se tre anni dopo il fatto: gitignore.io/api/java,android,eclipse,intellij
WernerCD,

Si noti che il problema IDEA youtrack.jetbrains.com/issue/IDEA-64312 che ho menzionato è contrassegnato come risolto in IntelliJ IDEA 14, quindi coloro che utilizzano la versione più recente e che desiderano mantenere i file nel controllo del codice sorgente potrebbero averne un momento migliore adesso rispetto a quando ho pubblicato questa domanda.

Risposte:


48

È possibile utilizzare la struttura di progetto basata su directory di IDEA , in cui le impostazioni sono archiviate nella directory .idea anziché nel file .ipr. Fornisce un controllo più dettagliato su ciò che è archiviato nel controllo versione. I file .iml saranno ancora disponibili, quindi non risolveranno i cambiamenti casuali in essi (forse li manterrai fuori dal controllo del codice sorgente?), Ma condividere cose come lo stile del codice e i profili di ispezione è facile, poiché ognuno di loro sarà nel proprio file nella directory .idea.


Passare alla struttura basata su directory ha sicuramente aiutato molto. Abbiamo rimosso i file .iml dal controllo del codice sorgente, il che rende IDEA un po 'confuso al momento del check out per la prima volta, ma per ora sembra il miglior compromesso. Dovevamo anche fare in modo che le ispezioni TeamCity funzionassero al di fuori del file Maven e di un profilo di ispezioni esportato, ma anche quello funzionava. Grazie!

Il collegamento è interrotto. Non sono sicuro di quale fosse il contenuto originale, ma ecco un link a un documento rilevante sulla struttura del progetto IDEA. Ed ecco un altro link che tratta questo specifico problema.
Ben

31

Dal DOC ufficiale: http://devnet.jetbrains.com/docs/DOC-1186

A seconda del formato del progetto IntelliJ IDEA (basato su file .ipr o basato su directory .idea), è necessario mettere i seguenti file di progetto IntelliJ IDEA sotto il controllo della versione:

Formato basato su file .ipr

Condividi il file .ipr del progetto e tutti i file del modulo .iml, non condividere il file .iws in quanto memorizza le impostazioni specifiche dell'utente.

Formato basato su directory .idea

Condividere tutti i file nella directory .idea nella radice del progetto tranne i file workspace.xml e task.xml che memorizzano le impostazioni specifiche dell'utente, inoltre condividono tutti i file del modulo .iml.

L'ho messo nel mio .gitignore:

#Project
workspace.xml
tasks.xml

8
Sì, e come ho detto nella domanda abbiamo condiviso .ipr e .iml e non .iws. Il problema è il problema in youtrack.jetbrains.com/issue/IDEA-64312 che i file .iml cambiano continuamente, portando a frequenti conflitti. Mantenere i file .iml fuori dal controllo del codice sorgente sembra funzionare meglio per noi, dal momento che IDEA li rigenera dal POM Maven e quindi possono semplicemente continuare a cambiare localmente senza conflitti con altri sviluppatori. Grazie!

Con questo approccio abbiamo problemi con alcuni nomi di risorse, ad esempio versioni di Android JDK. Alcuni membri del nostro team hanno nomi o versioni diverse rispetto a un SDK configurato. Per inviare i file di progetto al repository è necessario allineare questo tipo di cose al proprio team. Fino a ieri non eravamo abituati a inviare file proj al repository, ma è diventato difficile perché il nostro progetto è diventato grande e difficile da configurare.
Felipe,

L'unificazione di SDK usati e relativi percorsi è la soluzione semplice ed efficace
Kumait,

1
Sì. Ora tutti i nostri moduli puntano a "Project SDK", e ci allineiamo con il team per utilizzare lo stesso SDK. Almeno è solo un posto da modificare. Ma IntelliJ potrebbe farlo meglio.
Felipe,

23

È disponibile una risposta ufficiale . Supponendo che tu stia utilizzando il .ideaformato di progetto di cartella moderno (e ora predefinito) :

  • Aggiungi tutto ...
  • Tranne .idea/workspace.xml(che è specifico dell'utente)
  • Tranne .idea/tasks.xml(che è specifico dell'utente)
  • Tranne alcuni altri file che potrebbero contenere password / chiavi / ecc. (Vedere il link sopra per i dettagli)

Questo file .gitignore di esempio potrebbe essere un riferimento utile, anche se dovresti comunque leggere il link sopra per capire perché compaiono queste voci e decidere se ne hai bisogno.

Personalmente, ignoro anche il .idea/find.xmlfile poiché questo sembra cambiare ogni volta che esegui un'operazione di ricerca.


1
in base al link "esempio di file gitignore", farei un ulteriore passo avanti e sono lieto che tu abbia fornito questo. vai all'indirizzo di base e puoi combinare diversi tipi per ottenere un gitignore "completo". Per il mio progetto Android, che utilizza, ovviamente, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD,

16

Ho rimosso workspace.xml dal controllo del codice sorgente (+ aggiunto a .gitignore).


10

Il nostro team non controlla i file IntelliJ specifici del percorso. Partiamo dal presupposto che le persone sanno come utilizzare l'IDE e impostare un progetto. I file IntelliJ vanno nell'elenco delle modifiche 'ignorato'.

AGGIORNARE:

La risposta è più semplice ora che sto usando Maven e la sua struttura di directory predefinita.

IntelliJ dovrebbe essere chiesto di ignorare tutti i file in /.svn, /.ideae le /targetcartelle. Tutto ciò che riguarda le informazioni sul percorso di un individuo viene archiviato /.idea.

Tutto il resto è un gioco equo da impegnare in Subversion o Git.


14
La configurazione del progetto non è un grosso problema in quanto non accade spesso, ma è molto utile poter condividere configurazioni di build e profili di ispezioni senza dover inviare e-mail di schermate in giro o qualcosa del genere.

1
Controlla le cose che non dipendono dal percorso di una persona.
Duffymo,

2

Solo per condividere un altro approccio che il mio team ha usato: basta spostare qualsiasi file correlato all'IDE in una posizione diversa dove IntelliJ non riconosce e creare uno script per copiarli nella posizione "attiva" desiderata che viene ignorata da GIT.

Il vantaggio di questo approccio è che hai mantenuto la possibilità di condividere le impostazioni IDE attraverso il controllo della versione. L'unico inconveniente è che devi decidere quando eseguire lo script (probabilmente una volta per clone dell'area di lavoro o quando si desidera apportare modifiche) e puoi automatizzarlo incorporando lo script nel tuo processo di generazione o hook post-merge.

Questo approccio si basa sul fatto che IntelliJ cerca solo posizioni particolari per i suoi file di impostazione, quindi si applica anche ai file di configurazione del framework. In realtà abbiamo ignorato il file .properties di Grails allo stesso modo, quindi gli sviluppatori non accetteranno accidentalmente le loro modifiche alla configurazione locale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.