Bagaimana cara menangani file proyek IntelliJ IDEA di bawah kendali sumber Git yang terus berubah?

151

Semua orang di tim kami menggunakan IntelliJ IDEA, dan kami merasa berguna untuk menempatkan file proyeknya (.ipr dan .iml) ke dalam kontrol sumber sehingga kami dapat berbagi konfigurasi, pengaturan, dan inspeksi pembangunan. Plus, kita kemudian dapat menggunakan pengaturan inspeksi tersebut di server integrasi berkesinambungan kami dengan TeamCity. (Kami memiliki file .iws ruang kerja per-pengguna dalam file .gitignore dan tidak dalam kontrol sumber.)

Namun, file-file itu berubah sedikit ketika Anda melakukan apa saja di IDEA. Ada masalah dalam database isu IDEA untuk itu ( IDEA-64312 ), jadi mungkin orang mungkin menganggap ini sebagai bug di IDEA, tetapi itu adalah salah satu yang kita harus hidup dengan untuk masa yang akan datang.

Hingga baru-baru ini, kami menggunakan Subversion, tetapi kami baru-baru ini beralih ke Git. Kami masing-masing baru saja terbiasa dengan daftar perubahan file proyek yang kami abaikan dan tidak check-in kecuali ada perubahan file proyek yang ingin kami bagi dengan orang lain. Tetapi dengan Git, kekuatan sebenarnya tampaknya (dari apa yang kami eksplorasi) percabangan berkelanjutan yang didukungnya, dan beralih di antara cabang-cabang adalah masalah dengan file proyek yang selalu dimodifikasi. Seringkali itu hanya bisa menggabungkan perubahan entah bagaimana, dan mencoba menangani perubahan file proyek sekarang sedang diterapkan ke cabang baru. Namun, jika cabang baru telah mengubah file proyek (seperti cabang sedang bekerja pada modul baru yang belum ada di cabang lain), git hanya melempar kesalahan bahwa itu tidak t masuk akal untuk menggabungkan file ketika kedua cabang memiliki perubahan dan Anda memiliki perubahan secara lokal, dan saya lebih suka mengerti maksudnya. Dari baris perintah, seseorang dapat menggunakan "-f" pada perintah "git checkout" untuk memaksanya membuang perubahan lokal dan menggunakan cabang itu, tetapi (1) perintah Git Checkout GUI di IDEA (10.5.1) sepertinya tidak memiliki itu sebagai opsi yang dapat kita temukan, jadi kita perlu beralih ke baris perintah secara teratur, dan (2) Kami tidak yakin kami ingin terbiasa menggunakannya beri tanda dan beri tahu Git untuk membuang perubahan lokal kami.

Jadi, berikut adalah beberapa pemikiran yang kami miliki tentang opsi yang harus kami tangani dengan ini:

  1. Keluarkan file proyek sepenuhnya dari kendali sumber. Letakkan mereka di .gitignore, dan bagikan ke setiap orang dan TeamCity melalui beberapa cara lain, mungkin dengan menempatkan mereka dalam kendali sumber di tempat lain atau dengan nama lain. Tim kami cukup kecil sehingga opsi ini layak untuk dipertimbangkan, tetapi sepertinya tidak terlalu bagus.
  2. Lanjutkan hidup dengannya, berusaha memastikan untuk mengelola file mana yang kami miliki di cabang mana pada waktu tertentu. Sebagai bagian dari ini, kami dapat mendorong setiap pengembang untuk memiliki lebih dari satu salinan dari setiap proyek pada sistem mereka, sehingga mereka dapat memeriksa masing-masing ke cabang yang berbeda dengan set file proyek yang mungkin berbeda.
  3. Coba saja proyek (.ipr) dalam kontrol sumber, dengan file modul (.iml) tidak dalam kontrol sumber dan dalam file .gitignore. Hal utama yang tampaknya beralih sendiri di .ipr secara teratur adalah urutan konfigurasi build bersama, tapi mungkin kita bisa membagikan informasi secara terpisah tentang cara mengaturnya. Saya tidak begitu yakin bagaimana IDEA menangani hal semacam ini hanya memiliki beberapa file saja, terutama pada checkout baru.

Saya kira saya berharap ada beberapa solusi yang jelas (atau tidak jelas) yang kami lewatkan, mungkin berurusan dengan kemampuan penyesuaian besar yang tampaknya dimiliki Git dan IDEA. Tapi sepertinya kita bukan satu-satunya tim yang mengalami masalah ini. Pertanyaan yang agak mirip pada Stack Overflow termasuk 3495191 , 1000512 , dan 3873872 , tapi saya tidak tahu karena mereka persis masalah yang sama, dan mungkin seseorang dapat datang dengan pro dan kontra untuk berbagai pendekatan yang telah saya diuraikan, pendekatan yang tercantum dalam jawaban atas pertanyaan-pertanyaan itu, atau pendekatan yang mereka rekomendasikan.

Pang
sumber
Jawaban di bawah ini menyediakan gitignore.io sebagai basis yang baik. Saya menemukan itu berguna, bahkan jika tiga tahun setelah fakta: gitignore.io/api/java
android
Perhatikan bahwa masalah IDEA youtrack.jetbrains.com/issue/IDEA-64312 yang saya sebutkan ditandai telah diperbaiki di IntelliJ IDEA 14, sehingga mereka yang menggunakan versi terbaru dan ingin menyimpan file-file di kontrol sumber mungkin memiliki waktu yang lebih baik sekarang. daripada pada saat saya memposting pertanyaan ini.

Jawaban:

48

Anda dapat menggunakan struktur proyek berbasis direktori IDEA , di mana pengaturan disimpan dalam direktori .idea bukan file .ipr. Ini memberikan kontrol lebih halus atas apa yang disimpan dalam kontrol versi. File .iml masih ada, sehingga tidak menyelesaikan perubahan acak di dalamnya (mungkin menjaga mereka di luar kendali sumber?), Tetapi berbagi hal-hal seperti gaya kode dan profil inspeksi mudah, karena masing-masing akan dalam file sendiri di bawah direktori .idea.

Esko Luontola
sumber
Pindah ke struktur berbasis direktori pasti banyak membantu. Kami mengambil file .iml dari kontrol sumber, yang membuat IDEA sedikit bingung ketika memeriksa untuk pertama kalinya, tetapi tampaknya kompromi terbaik untuk saat ini. Kami juga harus melakukan inspeksi TeamCity dari file Maven dan profil inspeksi yang diekspor, tetapi kami juga berhasil. Terima kasih!
Tautan rusak. Tidak yakin apa konten aslinya, tetapi di sini ada tautan ke dokumen yang relevan tentang struktur proyek IDEA. Dan di sini ada tautan lain yang berhubungan dengan masalah khusus ini.
Ben.12
31

Dari DOC resmi: http://devnet.jetbrains.com/docs/DOC-1186

Bergantung pada format proyek IntelliJ IDEA (berbasis file .ipr atau .idea), Anda harus meletakkan file proyek IntelliJ IDEA berikut di bawah kontrol versi:

Format file .ipr

Bagikan file .ipr proyek dan dan semua file modul .iml, jangan bagikan file .iws karena menyimpan pengaturan spesifik pengguna.

format berbasis direktori .idea

Bagikan semua file di bawah direktori .idea di root proyek kecuali file workspace.xml dan task.xml yang menyimpan pengaturan spesifik pengguna, juga bagikan semua file modul .iml.

Saya meletakkannya di .gitignore saya:

#Project
workspace.xml
tasks.xml
Felipe
sumber
8
Ya, dan seperti yang saya katakan di pertanyaan, kami membagikan .ipr dan .iml dan bukan .iws. Masalahnya adalah masalah di youtrack.jetbrains.com/issue/IDEA-64312 bahwa file .iml berubah sepanjang waktu, yang menyebabkan seringnya terjadi konflik. Menjaga file .iml dari kontrol sumber tampaknya berfungsi lebih baik bagi kami, karena IDEA membuat ulang dari MOM POM, dan kemudian mereka dapat terus mengubah secara lokal tanpa konflik dengan pengembang lain. Terima kasih!
Dengan pendekatan ini, kami memiliki masalah dengan beberapa nama sumber daya, misalnya: versi Android JDK. Beberapa anggota tim kami memiliki nama atau versi berbeda untuk SDK yang dikonfigurasi. Mengirim file proyek ke repo Anda perlu menyelaraskan hal-hal semacam itu dengan tim Anda. Sampai kemarin kami tidak terbiasa mengirim file proj ke repo, tetapi menjadi sulit karena proyek kami menjadi besar dan sulit untuk dikonfigurasi.
Felipe
Memersatukan SDK bekas dan jalur relatif adalah solusi sederhana dan efektif
Kumait
1
Iya. Sekarang semua modul kami menunjuk ke "Project SDK", dan kami sejajar dengan tim untuk menggunakan SDK yang sama. Setidaknya hanya satu tempat untuk memodifikasi. Tapi IntelliJ bisa melakukannya dengan lebih baik.
Felipe
23

Sebuah jawaban resmi tersedia . Dengan asumsi Anda menggunakan .ideaformat proyek folder modern (dan sekarang default) :

  • Tambahkan semuanya ...
  • Kecuali .idea/workspace.xml(yang khusus untuk pengguna)
  • Kecuali .idea/tasks.xml(yang khusus untuk pengguna)
  • Kecuali beberapa file lain yang mungkin berisi kata sandi / kunci / dll (lihat tautan di atas untuk detailnya)

File .gitignore sampel ini mungkin menjadi referensi yang berguna, meskipun Anda masih harus membaca tautan di atas untuk memahami mengapa entri ini muncul dan memutuskan apakah Anda membutuhkannya.

Secara pribadi saya juga mengabaikan .idea/find.xmlfile karena ini tampaknya berubah setiap kali Anda melakukan operasi pencarian.

Drew Noakes
sumber
1
berdasarkan tautan "file contoh gitignore", saya akan mengambil langkah lebih jauh dan saya senang Anda memberikan ini. buka alamat berdasarkan dan Anda dapat menggabungkan berbagai jenis untuk mendapatkan gitignore "penuh". Untuk proyek Android saya, yang menggunakan, tentu saja, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android
klik
16

Saya mengambil workspace.xml dari kontrol sumber (+ ditambahkan ke .gitignore).

ripper234
sumber
10

Tim kami tidak memeriksa dalam file IntelliJ jalur khusus. Kami berasumsi bahwa orang tahu bagaimana menggunakan IDE dan mengatur proyek. File IntelliJ masuk ke daftar perubahan 'diabaikan'.

MEMPERBARUI:

Jawabannya lebih mudah sekarang karena saya menggunakan Maven dan struktur direktori default-nya.

IntelliJ harus diminta untuk mengabaikan semua file di /.svn, /.ideadan /targetfolder. Segala sesuatu yang berkaitan dengan informasi jalur individu disimpan di /.idea.

Yang lainnya adalah permainan yang adil untuk dilakukan pada Subversion atau Git.

Duffymo
sumber
14
Menyiapkan proyek bukanlah masalah besar karena tidak sering terjadi, tetapi sangat berguna untuk dapat berbagi konfigurasi pembangunan dan profil inspeksi tanpa perlu mengirim email tangkapan layar sekitar atau sesuatu.
1
Periksa hal-hal yang tidak bergantung pada jalur individu.
duffymo
2

Hanya untuk membagikan pendekatan lain yang digunakan tim saya: Pindahkan saja file apa pun yang terkait dengan IDE ke lokasi berbeda di mana IntelliJ tidak mengenali, dan buat skrip untuk menyalinnya ke lokasi 'aktif' yang diinginkan yang diabaikan oleh GIT.

Manfaat dari pendekatan ini adalah Anda menyimpan opsi berbagi pengaturan IDE melalui kontrol versi. Satu-satunya kelemahan adalah Anda harus memutuskan kapan harus menjalankan skrip (mungkin sekali per klon ruang kerja atau ketika perubahan diinginkan), dan Anda dapat mengotomatiskan ini dengan memasukkan skrip dalam proses pembuatan atau kait pasca penggabungan.

Pendekatan ini bergantung pada IntelliJ yang hanya mencari lokasi tertentu untuk file pengaturannya, jadi itu juga berlaku untuk file konfigurasi kerangka kerja. Sebenarnya kami mengabaikan file .properties Grails dengan cara yang sama, sehingga pengembang tidak akan sengaja memeriksa perubahan konfigurasi lokal mereka.

Shawn
sumber