Làm thế nào để đối phó với các tệp dự án IntelliJ IDEA dưới sự kiểm soát nguồn Git liên tục thay đổi?


151

Mọi người trong nhóm của chúng tôi sử dụng IntelliJ IDEA và chúng tôi thấy hữu ích khi đặt các tệp dự án của nó (.ipr và .iml) vào kiểm soát nguồn để chúng tôi có thể chia sẻ cấu hình, cài đặt và kiểm tra bản dựng. Ngoài ra, sau đó chúng tôi có thể sử dụng các cài đặt kiểm tra đó trên máy chủ tích hợp liên tục của chúng tôi với TeamCity. (Chúng tôi có tệp .iws cho mỗi người dùng trong tệp .gitignore và không kiểm soát nguồn.)

Tuy nhiên, những tệp đó thay đổi theo những cách nhỏ khi bạn làm bất cứ điều gì trong IDEA. Có một vấn đề trong cơ sở dữ liệu vấn đề của IDEA cho nó ( IDEA-64312 ), vì vậy có lẽ người ta có thể coi đây là một lỗi trong IDEA, nhưng đó là một vấn đề chúng ta cần phải sống trong tương lai gần.

Cho đến gần đây, chúng tôi đã sử dụng Subversion, nhưng gần đây chúng tôi đã chuyển sang Git. Chúng tôi đã từng quen với việc có một danh sách thay đổi các tệp dự án mà chúng tôi đã bỏ qua và không đăng ký trừ khi có các thay đổi tệp dự án mà chúng tôi muốn chia sẻ với người khác. Nhưng với Git, sức mạnh thực sự dường như (từ những gì chúng ta đang khám phá) sự phân nhánh liên tục mà nó khuyến khích và chuyển đổi giữa các nhánh là một nỗi đau với các tệp dự án luôn bị sửa đổi. Thường thì nó chỉ có thể hợp nhất trong các thay đổi bằng cách nào đó và cố gắng xử lý các thay đổi tệp dự án hiện đang được áp dụng cho nhánh mới. Tuy nhiên, nếu nhánh mới đã thay đổi các tệp dự án (chẳng hạn như nhánh đang hoạt động trên một mô-đun mới chưa có trong các nhánh khác), git chỉ đưa ra một lỗi mà nó không xảy ra ' Không có ý nghĩa gì để hợp nhất trong các tệp khi cả hai nhánh có thay đổi và bạn có thay đổi cục bộ, và tôi có thể hiểu quan điểm của nó hơn. Từ dòng lệnh, người ta có thể sử dụng "-f" trên lệnh "git checkout" để buộc nó loại bỏ các thay đổi cục bộ và sử dụng thay vào đó, nhưng (1) lệnh GUI Git Checkout trong IDEA (10.5.1) dường như không có tùy chọn nào mà chúng ta có thể tìm thấy, vì vậy chúng ta cần chuyển sang dòng lệnh một cách thường xuyên và (2) Chúng tôi không chắc chúng ta muốn có thói quen sử dụng nó gắn cờ và bảo Git ném ra những thay đổi cục bộ của chúng tôi.

Vì vậy, đây là một số suy nghĩ chúng ta có về các lựa chọn chúng ta phải đối phó với điều này:

  1. Lấy các tệp dự án ra khỏi kiểm soát nguồn hoàn toàn. Đặt chúng vào .gitignore và phân phối chúng cho mỗi người và TeamCity thông qua một số phương tiện khác, có thể bằng cách đặt chúng trong kiểm soát nguồn ở một nơi khác hoặc dưới tên khác. Nhóm của chúng tôi đủ nhỏ tùy chọn này đủ khả thi để xem xét, nhưng nó không có vẻ tuyệt vời.
  2. Tiếp tục sống với nó, cố gắng đảm bảo quản lý các tệp chúng ta có trên các nhánh tại một thời điểm nhất định. Là một phần của điều này, chúng tôi có thể khuyến khích mỗi nhà phát triển có nhiều hơn một bản sao của mỗi dự án trên hệ thống của họ, để họ có thể kiểm tra từng nhánh đến một nhánh khác nhau với các tập tin dự án khác nhau.
  3. Hãy thử chỉ có dự án (.ipr) trong điều khiển nguồn, với các tệp mô-đun (.iml) không nằm trong điều khiển nguồn và trong tệp .gitignore. Điều chính dường như tự chuyển đổi trong .ipr một cách thường xuyên là thứ tự các cấu hình bản dựng được chia sẻ, nhưng có lẽ chúng ta chỉ có thể chia sẻ thông tin riêng về cách thiết lập chúng. Tôi không chắc chắn làm thế nào IDEA đối phó với loại điều này chỉ có một số tệp của nó, đặc biệt là trên một thanh toán mới.

Tôi đoán tôi đang hy vọng có một giải pháp rõ ràng (hoặc không rõ ràng) mà chúng tôi đã bỏ lỡ, có lẽ là đối phó với khả năng tùy biến rất lớn mà cả Git và IDEA dường như đều có. Nhưng có vẻ như chúng tôi không thể là đội duy nhất gặp vấn đề này. Các câu hỏi tương tự trên Stack Overflow bao gồm 3495191 , 10005123873872 , nhưng tôi không biết vì chúng chính xác là cùng một vấn đề và có lẽ ai đó có thể đưa ra những ưu và nhược điểm cho các phương pháp khác nhau mà tôi đã nêu ra, cách tiếp cận được liệt kê trong câu trả lời cho những câu hỏi, hoặc cách tiếp cận mà họ đề xuất.



Trả lời dưới đây cung cấp gitignore.io như là một cơ sở tốt. Tôi thấy nó hữu ích, ngay cả khi ba năm sau thực tế: gitignore.io/api/java,android,eclipse,intellij
WernerCD

Lưu ý rằng vấn đề IDEA youtrack.jetbrains.com/su/IDEA-64312 tôi đã đề cập được đánh dấu là đã sửa trong IntelliJ IDEA 14, vì vậy những người sử dụng phiên bản mới nhất và muốn giữ các tệp trong kiểm soát nguồn có thể có thời gian tốt hơn bây giờ hơn tại thời điểm tôi đăng câu hỏi này

Câu trả lời:


48

Bạn có thể sử dụng cấu trúc dự án dựa trên thư mục của IDEA , trong đó các cài đặt được lưu trữ trong thư mục .idea thay vì tệp .ipr. Nó cho phép kiểm soát chi tiết hơn đối với những gì được lưu trữ trong kiểm soát phiên bản. Các tệp .iml vẫn sẽ tồn tại, vì vậy nó không giải quyết được các thay đổi ngẫu nhiên trong chúng (có thể giữ chúng ngoài tầm kiểm soát nguồn?), Nhưng việc chia sẻ những thứ như kiểu mã và hồ sơ kiểm tra là dễ dàng, vì mỗi tệp sẽ trong tập tin riêng của nó dưới thư mục .idea.


Di chuyển đến cấu trúc dựa trên thư mục chắc chắn đã giúp rất nhiều. Chúng tôi đã lấy các tệp .iml ra khỏi kiểm soát nguồn, điều này khiến IDEA hơi bối rối khi kiểm tra lần đầu tiên, nhưng có vẻ như đó là sự thỏa hiệp tốt nhất hiện nay. Chúng tôi cũng phải có các kiểm tra TeamCity hoạt động khỏi tệp Maven và hồ sơ kiểm tra xuất khẩu, nhưng chúng tôi cũng đã làm việc đó. Cảm ơn bạn!

Liên kết bị hỏng. Không chắc nội dung ban đầu là gì, nhưng đây là một liên kết đến một tài liệu có liên quan về cấu trúc dự án của IDEA. Và đây là một liên kết khác đối phó với vấn đề cụ thể này.
Ben.12

31

Từ DOC chính thức: http://devnet.jetbrains.com/docs/DOC-1186

Tùy thuộc vào định dạng dự án IntelliJ IDEA (dựa trên tệp .ipr hoặc dựa trên thư mục .idea), bạn nên đặt các tệp dự án IntelliJ IDEA sau đây trong điều khiển phiên bản:

định dạng dựa trên tập tin .ipr

Chia sẻ tệp .ipr của dự án và tất cả các tệp mô-đun .iml, không chia sẻ tệp .iws vì nó lưu các cài đặt cụ thể của người dùng.

định dạng dựa trên thư mục .idea

Chia sẻ tất cả các tệp trong thư mục .idea trong thư mục gốc của dự án ngoại trừ các tệp workspace.xml và task.xml lưu trữ các cài đặt cụ thể của người dùng, cũng chia sẻ tất cả các tệp mô-đun .iml.

Tôi đặt nó trong .gitignore của tôi:

#Project
workspace.xml
tasks.xml

8
Vâng, và như tôi đã nói trong câu hỏi, chúng tôi đã chia sẻ .ipr và .iml chứ không phải .iws. Vấn đề là vấn đề trong youtrack.jetbrains.com/su/IDEA-64312 rằng các tệp .iml thay đổi liên tục, dẫn đến xung đột thường xuyên. Giữ các tệp .iml ngoài tầm kiểm soát nguồn dường như hoạt động tốt hơn đối với chúng tôi, vì IDEA tạo lại chúng từ Maven POM, và sau đó chúng có thể tiếp tục thay đổi cục bộ mà không xung đột với các nhà phát triển khác. Cảm ơn!

Với cách tiếp cận này, chúng tôi gặp vấn đề với một số tên tài nguyên, ví dụ: phiên bản Android JDK. Một số thành viên trong nhóm của chúng tôi có các tên khác nhau hoặc các phiên bản khác nhau cho SDK được định cấu hình. Gửi các tệp dự án để repo bạn cần phải sắp xếp những thứ đó với nhóm của bạn. Cho đến ngày hôm qua, chúng tôi đã không được sử dụng để gửi các tệp proj để repo, nhưng nó trở nên khó khăn vì dự án của chúng tôi trở nên lớn và khó cấu hình.
Felipe

Hợp nhất SDK đã sử dụng và đường dẫn tương đối là giải pháp đơn giản và hiệu quả
Kumait

1
Đúng. Bây giờ tất cả các mô-đun của chúng tôi đều trỏ đến "SDK dự án" và chúng tôi liên kết với nhóm để sử dụng cùng một SDK. Ít nhất chỉ là một nơi để sửa đổi. Nhưng IntelliJ có thể làm điều đó tốt hơn.
Felipe

23

Một câu trả lời chính thức có sẵn . Giả sử bạn đang sử dụng .ideađịnh dạng dự án thư mục hiện đại (và hiện mặc định) :

  • Thêm mọi thứ ...
  • Ngoại trừ .idea/workspace.xml(dành riêng cho người dùng)
  • Ngoại trừ .idea/tasks.xml(dành riêng cho người dùng)
  • Ngoại trừ một số tệp khác có thể chứa mật khẩu / khóa / vv (xem liên kết ở trên để biết chi tiết)

Tệp .gitignore mẫu này có thể là một tài liệu tham khảo hữu ích, mặc dù vậy bạn vẫn nên đọc liên kết trên để hiểu lý do tại sao các mục này xuất hiện và quyết định xem bạn có cần chúng không.

Cá nhân tôi cũng bỏ qua các .idea/find.xmltập tin vì điều này dường như thay đổi mỗi khi bạn thực hiện một hoạt động tìm kiếm.


1
dựa trên liên kết "tệp gitignore mẫu", tôi sẽ tiến thêm một bước nữa và rất vui vì bạn đã cung cấp điều này. đi đến địa chỉ dựa trên và bạn có thể kết hợp các loại khác nhau để có được một gitignore "đầy đủ". Đối với dự án Android của tôi, sử dụng, rõ ràng, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD

16

Tôi đã lấy workspace.xml ra khỏi kiểm soát nguồn (+ được thêm vào .gitignore).


10

Nhóm của chúng tôi không kiểm tra các tệp IntelliJ dành riêng cho đường dẫn. Chúng tôi giả định rằng mọi người biết cách sử dụng IDE và thiết lập một dự án. Các tệp IntelliJ đi vào danh sách thay đổi 'bị bỏ qua'.

CẬP NHẬT:

Câu trả lời bây giờ dễ dàng hơn là tôi đang sử dụng Maven và cấu trúc thư mục mặc định của nó.

IntelliJ nên được yêu cầu để bỏ qua tất cả các file trong /.svn, /.idea/targetthư mục. Mọi thứ liên quan đến thông tin đường dẫn của một cá nhân đều được lưu trữ trong /.idea.

Mọi thứ khác là trò chơi công bằng được cam kết với Subversion hoặc Git.


14
Thiết lập dự án không phải là vấn đề lớn vì nó không xảy ra thường xuyên, nhưng rất tiện lợi để có thể chia sẻ cấu hình xây dựng và hồ sơ kiểm tra mà không cần gửi email ảnh chụp màn hình xung quanh hoặc một cái gì đó.

1
Kiểm tra những thứ không phụ thuộc vào con đường của một cá nhân.
duffymo

2

Chỉ để chia sẻ một cách tiếp cận khác mà nhóm của tôi đã sử dụng: Chỉ cần di chuyển bất kỳ tệp nào liên quan đến IDE sang một vị trí khác mà IntelliJ không nhận ra và tạo một tập lệnh để sao chép chúng vào vị trí 'hoạt động' mong muốn bị GIT bỏ qua.

Lợi ích của phương pháp này là bạn giữ tùy chọn chia sẻ cài đặt IDE thông qua kiểm soát phiên bản. Hạn chế duy nhất là bạn phải quyết định khi nào chạy tập lệnh (có thể một lần trên mỗi bản sao không gian làm việc hoặc khi nào cần thay đổi) và bạn có thể tự động hóa việc này thông qua việc kết hợp tập lệnh trong quy trình xây dựng hoặc móc nối sau.

Cách tiếp cận này dựa vào việc IntelliJ chỉ tìm kiếm các vị trí cụ thể cho các tệp cài đặt của nó, do đó, nó cũng áp dụng với các tệp cấu hình khung. Trên thực tế, chúng tôi đã bỏ qua tệp Grails .properations theo cùng một cách, vì vậy các nhà phát triển sẽ không vô tình kiểm tra các thay đổi cấu hình cục bộ của họ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.