Como lidar com os arquivos de projeto do IntelliJ IDEA sob o controle de origem do Git, mudando constantemente?

151

Todos na nossa equipe usam o IntelliJ IDEA, e achamos útil colocar seus arquivos de projeto (.ipr e .iml) no controle de origem, para que possamos compartilhar configurações, configurações e inspeções de compilação. Além disso, podemos usar essas configurações de inspeção em nosso servidor de integração contínua com o TeamCity. (Temos o arquivo .iws da área de trabalho por usuário no arquivo .gitignore e não no controle de origem.)

No entanto, esses arquivos mudam de pequenas maneiras quando você faz praticamente qualquer coisa no IDEA. Há um problema no banco de dados de problemas do IDEA para ele ( IDEA-64312 ), então talvez alguém possa considerar isso um bug no IDEA, mas é com o qual precisaremos conviver no futuro próximo.

Até recentemente, estávamos usando o Subversion, mas recentemente mudamos para o Git. Cada um de nós se acostumou a ter uma lista de alterações nos arquivos do projeto que ignoramos e não efetuamos check-in, a menos que houvesse alterações nos arquivos do projeto que desejássemos compartilhar com outras pessoas. Mas com o Git, o poder real parece ser (pelo que estamos explorando) a ramificação contínua que ele incentiva, e alternar entre ramificações é uma dor, pois os arquivos do projeto sempre foram modificados. Geralmente, ele pode mesclar as alterações de alguma forma e tenta lidar com as alterações no arquivo do projeto que estão sendo aplicadas agora na nova ramificação. No entanto, se o novo ramo alterou os arquivos do projeto (como o ramo está trabalhando em um novo módulo que ainda não está nos outros ramos), o git apenas gera um erro que não faz ' não faz sentido mesclar os arquivos quando o ramo tem alterações e você tem alterações localmente, e eu posso entender o ponto. Na linha de comando, pode-se usar "-f" no comando "git checkout" para forçá-lo a jogar fora as alterações locais e usar as ramificações, mas (1) o comando Git Checkout GUI no IDEA (10.5.1) parece não ter isso como uma opção que podemos encontrar; portanto, precisamos mudar para a linha de comando regularmente e (2) não temos certeza de que queremos ter o hábito de usá-lo. sinalizar e dizer ao Git para descartar nossas alterações locais.

Então, aqui estão alguns pensamentos que temos sobre as opções que temos que lidar com isso:

  1. Tire os arquivos do projeto completamente do controle de origem. Coloque-os no .gitignore e distribua-os a cada pessoa e TeamCity por outros meios, talvez colocando-os no controle de origem em outro lugar ou sob outros nomes. Nossa equipe é pequena o suficiente para considerar essa opção, mas isso não parece ótimo.
  2. Continue vivendo com ele, tentando garantir quais arquivos temos em quais ramificações em um determinado momento. Como parte disso, podemos incentivar cada desenvolvedor a ter mais de uma cópia de cada projeto em seu sistema, para que cada um possa fazer check-out em uma ramificação diferente, com conjuntos de arquivos de projeto possivelmente diferentes.
  3. Tente ter apenas o projeto (.ipr) no controle de origem, com os arquivos do módulo (.iml) que não estão no controle de origem e no arquivo .gitignore. A principal coisa que parece mudar por conta própria no .ipr regularmente é a ordem das configurações de compilação compartilhadas, mas talvez possamos compartilhar as informações separadamente sobre como configurá-las. Não tenho muita certeza de como a IDEA lida com esse tipo de coisa, tendo apenas alguns de seus arquivos, especialmente em um novo checkout.

Eu acho que espero que exista alguma solução óbvia (ou não óbvia) que perdemos, talvez lidando com a enorme capacidade de personalização que o Git e o IDEA parecem ter. Mas parece que não poderíamos ser a única equipe com esse problema. As perguntas que são semelhantes no Stack Overflow incluem 3495191 , 1000512 e 3873872 , mas não sei como são exatamente o mesmo problema, e talvez alguém possa apresentar os prós e contras das várias abordagens descritas, abordagens listadas nas respostas a essas perguntas ou abordagens recomendadas.

Pang
fonte
A resposta abaixo forneceu o gitignore.io como uma boa base. Achei que seria útil, mesmo três anos após o fato: gitignore.io/api/java,android,eclipse,intellij
WernerCD
Observe que o problema da IDEA que youtrack.jetbrains.com/issue/IDEA-64312 que eu mencionei está marcado como corrigido no IntelliJ IDEA 14, portanto, aqueles que usam a versão mais recente e desejam manter os arquivos no controle de origem podem aproveitar melhor agora. do que no momento em que publiquei esta pergunta.

Respostas:

48

Você pode usar os IDEA's estrutura de projeto baseada em diretório , onde as configurações são armazenadas no diretório .idea em vez do arquivo .ipr. Oferece controle mais refinado sobre o que é armazenado no controle de versão. Os arquivos .iml ainda estarão por aí, por isso não resolverão as alterações aleatórias neles (talvez mantê-los fora do controle de origem?), Mas é fácil compartilhar coisas como estilo de código e perfis de inspeção, pois cada um deles será em seu próprio arquivo no diretório .idea.

Esko Luontola
fonte
Mover para a estrutura baseada em diretório definitivamente ajudou muito. Tiramos os arquivos .iml do controle de origem, o que deixa a IDEA um pouco confusa ao fazer o check-out pela primeira vez, mas parece o melhor compromisso por enquanto. Também tínhamos que fazer com que as inspeções do TeamCity trabalhassem no arquivo Maven e em um perfil de inspeções exportadas, mas também funcionamos. Obrigado!
O link está quebrado. Não tenho certeza qual era o conteúdo original, mas aqui está um link para um documento relevante sobre a estrutura do projeto da IDEA. E aqui está outro link que trata desse problema específico.
precisa saber é o seguinte
31

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

Dependendo do formato do projeto IntelliJ IDEA (com base no arquivo .ipr ou no diretório .idea), você deve colocar os seguintes arquivos de projeto do IntelliJ IDEA sob o controle de versão:

Formato baseado em arquivo .ipr

Compartilhe o arquivo .ipr do projeto e todos os arquivos do módulo .iml, não compartilhe o arquivo .iws, pois ele armazena configurações específicas do usuário.

Formato baseado no diretório .idea

Compartilhe todos os arquivos no diretório .idea na raiz do projeto, exceto os arquivos workspace.xml e tasks.xml que armazenam configurações específicas do usuário, e também compartilhem todos os arquivos do módulo .iml.

Coloquei no meu .gitignore:

#Project
workspace.xml
tasks.xml
Felipe
fonte
8
Sim, e como eu disse na pergunta, compartilhamos os .ipr e .iml e não os .iws. O problema é o problema em youtrack.jetbrains.com/issue/IDEA-64312 em que os arquivos .iml mudam o tempo todo, levando a conflitos frequentes. Manter os arquivos .iml fora do controle de origem parece funcionar melhor para nós, pois o IDEA os regenera a partir do POM do Maven e eles podem continuar mudando localmente sem conflitos com outros desenvolvedores. Obrigado!
Com essa abordagem, temos problemas com alguns nomes de recursos, por exemplo: versões do Android JDK. Alguns membros da nossa equipe têm nomes diferentes ou versões diferentes para um SDK configurado. Ao enviar arquivos de projeto para repo, você precisa alinhar esse tipo de coisa à sua equipe. Até ontem, não tínhamos o costume de enviar arquivos de proj para repo, mas ficou difícil porque nosso projeto se tornou grande e difícil de configurar.
Felipe
Unificar SDK utilizados e caminhos relativos é a solução mais simples e eficaz
Kumait
1
Sim. Agora, todos os nossos módulos apontam para "Project SDK" e nos alinhamos à equipe para usar o mesmo SDK. Pelo menos é apenas um lugar para modificar. Mas o IntelliJ poderia fazer melhor.
Felipe
23

Uma resposta oficial está disponível . Supondo que você esteja usando o .ideaformato do projeto de pasta moderno (e agora padrão) :

  • Adicione tudo ...
  • Exceto .idea/workspace.xml (que é específico do usuário)
  • Exceto .idea/tasks.xml (que é específico do usuário)
  • Exceto alguns outros arquivos que podem conter senhas / chaves / etc (veja o link acima para detalhes)

Este arquivo .gitignore de amostra pode ser uma referência útil, mas você ainda deve ler o link acima para entender por que essas entradas aparecem e decidir se você precisa delas.

Pessoalmente, também ignoro o .idea/find.xmlarquivo, pois isso parece mudar toda vez que você realiza uma operação de pesquisa.

Drew Noakes
fonte
1
com base no link "arquivo gitignore de amostra", daria um passo adiante e fico feliz que você tenha fornecido isso. vá para o endereço baseado e você pode combinar diferentes tipos para obter um gitignore "completo". Para o meu projeto Android, que usa, obviamente, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD
16

Tirei o workspace.xml do controle de origem (+ adicionado ao .gitignore).

ripper234
fonte
10

Nossa equipe não faz check-in de arquivos IntelliJ específicos do caminho. Assumimos que as pessoas saibam como usar o IDE e configurar um projeto. Os arquivos IntelliJ entram na lista de alterações 'ignoradas'.

ATUALIZAR:

A resposta é mais fácil agora que estou usando o Maven e sua estrutura de diretórios padrão.

IntelliJ deve ser convidado a ignorar todos os arquivos /.svn, /.ideae /targetpastas. Tudo referente às informações do caminho de um indivíduo é armazenado /.idea.

Tudo o resto é um jogo justo para se comprometer com o Subversion ou o Git.

duffymo
fonte
14
A configuração do projeto não é grande coisa, pois não acontece com frequência, mas é muito útil poder compartilhar configurações de configuração e perfis de inspeção sem a necessidade de enviar capturas de tela por e-mail ou algo assim.
1
Verifique o material que não depende do caminho de um indivíduo.
Duffymo
2

Apenas para compartilhar outra abordagem que minha equipe usou: mova os arquivos relacionados ao IDE para um local diferente onde o IntelliJ não reconheça e crie um script para copiá-los para o local 'ativo' desejado que é ignorado pelo GIT.

O benefício dessa abordagem é que você manteve a opção de compartilhar as configurações do IDE por meio do controle de versão. A única desvantagem é que você precisa decidir quando executar o script (provavelmente uma vez por clone da área de trabalho ou quando as alterações são desejadas), e você pode automatizar isso incorporando o script no processo de construção ou no gancho pós-mesclagem.

Essa abordagem baseia-se no fato de o IntelliJ pesquisar apenas em locais específicos por seus arquivos de configuração, assim também se aplica aos arquivos de configuração da estrutura. Na verdade, ignoramos o arquivo .properties do Grails da mesma maneira, para que os desenvolvedores não façam o check-in acidentalmente de suas alterações na configuração local.

Shawn
fonte