Git स्रोत नियंत्रण के तहत IntelliJ IDEA प्रोजेक्ट फ़ाइलों के साथ लगातार बदलते हुए कैसे निपटें?


151

हमारी टीम के सभी लोग IntelliJ IDEA का उपयोग करते हैं, और हम इसकी परियोजना फाइलों (.ipr और .iml) को स्रोत नियंत्रण में रखना उपयोगी पाते हैं ताकि हम बिल्ड कॉन्फ़िगरेशन, सेटिंग्स और निरीक्षणों को साझा कर सकें। इसके अलावा, हम टीमटिटी के साथ हमारे निरंतर एकीकरण सर्वर पर उन निरीक्षण सेटिंग्स का उपयोग कर सकते हैं। (हमारे पास प्रति-उपयोगकर्ता कार्यक्षेत्र .iws फ़ाइल में .ignignore फ़ाइल है और स्रोत नियंत्रण में नहीं है।)

हालाँकि, जब आप IDEA में किसी भी चीज़ के बारे में करते हैं, तो वे फाइलें थोड़े बदल जाती हैं। इसके लिए IDEA के समस्या डेटाबेस में एक समस्या है ( IDEA-64312 ), इसलिए शायद कोई इसे आईडिया में बग पर विचार कर सकता है, लेकिन यह एक है जिसे हमें भविष्य के लिए जीना होगा।

हाल तक तक, हम तोड़फोड़ का उपयोग कर रहे थे, लेकिन हमने हाल ही में गिट में स्विच किया। हमारे पास हर एक प्रॉजेक्ट फाइल की एक चेंज लिस्ट होने की आदत थी, जिसे हमने नजरअंदाज किया और जब तक कि प्रोजेक्ट फाइल में बदलाव नहीं हुए, जिन्हें हम दूसरों के साथ साझा करना चाहते थे। लेकिन Git के साथ, वास्तविक शक्ति प्रतीत होती है (हम जो खोज कर रहे हैं) से यह निरंतर ब्रांचिंग है जो इसे प्रोत्साहित करती है, और शाखाओं के बीच स्विच करना एक दर्द है परियोजना फाइलों के साथ हमेशा संशोधित किया गया है। अक्सर यह सिर्फ किसी भी तरह के बदलावों में विलय कर सकता है, और नई शाखा में लागू होने वाले प्रोजेक्ट फ़ाइल परिवर्तनों से निपटने की कोशिश करता है। हालाँकि, यदि नई शाखा ने प्रोजेक्ट फ़ाइल बदल दी हैं (जैसे कि शाखा एक नए मॉड्यूल पर काम कर रही है जो अभी अन्य शाखाओं में नहीं है), तो गिट सिर्फ एक त्रुटि फेंकता है कि यह नहीं होता है ' t दोनों शाखाओं में परिवर्तन होने पर फ़ाइलों में विलय करने का कोई मतलब नहीं है और आपके पास स्थानीय स्तर पर परिवर्तन हैं, और मैं इसके बिंदु को समझ सकता हूं। कमांड लाइन से, कोई भी "git चेकआउट" कमांड पर "-f" का उपयोग कर सकता है ताकि उसे स्थानीय परिवर्तनों को फेंकने और शाखा के बदले उपयोग करने के लिए मजबूर किया जा सके, लेकिन (1) GEA चेकआउट GUI कमांड IDEA (10.5.1) में ऐसा प्रतीत नहीं होता है कि एक विकल्प के रूप में, जिसे हम पा सकते हैं, इसलिए हमें नियमित रूप से कमांड लाइन पर स्विच करने की आवश्यकता होगी, और (2) हमें यकीन नहीं है कि हम इसका उपयोग करने की आदत में रहना चाहते हैं झंडा और हमारे स्थानीय परिवर्तनों को बाहर निकालने के लिए Git को बताना।

तो, यहाँ कुछ विचार हैं जिन पर हमें विकल्प हैं जिनसे हमें निपटना है:

  1. प्रोजेक्ट फ़ाइलों को पूरी तरह से स्रोत नियंत्रण से बाहर निकालें। उन्हें .gitignore में रखें, और उन्हें प्रत्येक व्यक्ति और TeamCity को किसी अन्य माध्यम से वितरित करें, शायद उन्हें स्रोत नियंत्रण में रखकर कहीं और या अन्य नामों से। हमारी टीम काफी छोटी है यह विकल्प विचार करने के लिए पर्याप्त है, लेकिन यह बहुत अच्छा नहीं लगता है।
  2. इसके साथ रहना जारी रखें, यह सुनिश्चित करने की कोशिश करें कि किसी निश्चित समय में हमारे पास कौन सी फाइलें हैं। इस के भाग के रूप में, हम प्रत्येक डेवलपर को उनके सिस्टम पर प्रत्येक प्रोजेक्ट की एक से अधिक कॉपी करने के लिए प्रोत्साहित कर सकते हैं, इसलिए वे प्रोजेक्ट फ़ाइलों के संभवतः अलग-अलग सेट के साथ एक अलग शाखा में प्रत्येक की जाँच कर सकते हैं।
  3. स्रोत नियंत्रण में केवल प्रोजेक्ट (.ipr) होने का प्रयास करें, मॉड्यूल (.iml) फ़ाइलों के साथ स्रोत नियंत्रण में और .gitignore फ़ाइल में नहीं। मुख्य चीज जो नियमित रूप से अपने .ipr पर स्वयं के चारों ओर स्विच करने के लिए लगती है, वह साझा बिल्ड कॉन्फ़िगरेशन का क्रम है, लेकिन हो सकता है कि हम जानकारी को अलग से साझा कर सकें कि उन्हें कैसे सेट किया जाए। मुझे यकीन नहीं है कि IDEA इस तरह की चीज़ों से कैसे निपटती है, इसकी कुछ फाइलें हालांकि, खासकर एक नए चेकआउट पर।

मुझे लगता है कि मैं उम्मीद कर रहा हूं कि हमारे द्वारा याद किए गए कुछ स्पष्ट (या गैर-स्पष्ट) समाधान हैं, शायद विशाल कस्टमिज़ेबिलिटी से निपटना जो कि Git और IDEA दोनों के लिए लगता है। लेकिन ऐसा लगता है कि हम संभवतः इस समस्या वाले एकमात्र दल नहीं हो सकते हैं। स्टैक ओवरफ्लो पर इसी तरह के प्रश्न 3495191 , 1000512 और 3873872 शामिल हैं , लेकिन मुझे नहीं पता कि वे वास्तव में एक ही मुद्दा हैं, और शायद कोई मेरे पास विभिन्न दृष्टिकोणों के लिए पेशेवरों और विपक्ष के साथ आ सकता है। उल्लिखित, उन प्रश्नों के उत्तर में सूचीबद्ध दृष्टिकोण, या दृष्टिकोण जो वे सुझाते हैं।



नीचे दिए गए उत्तर gitignore.io को एक अच्छा आधार मानते हैं। मुझे यह उपयोगी लगा, भले ही इस तथ्य के तीन साल बाद: gitignore.io/api/java,android,eclipse,intellij
WernerCD

ध्यान दें कि आईडीईए आप जारी करते हैं। यह आप का उल्लेख है। इंटेलीज आईडीईए 14 में तय किया गया है, इसलिए जो नवीनतम संस्करण का उपयोग कर रहे हैं और फाइलों को स्रोत नियंत्रण में रखना चाहते हैं, उनके लिए इसका बेहतर समय हो सकता है। उस समय की तुलना में मैंने यह प्रश्न पोस्ट किया है।

जवाबों:


48

आप आईडीईए की निर्देशिका-आधारित परियोजना संरचना का उपयोग कर सकते हैं , जहां सेटिंग्स .ipr फ़ाइल के बजाय .idea निर्देशिका में संग्रहीत की जाती हैं। यह संस्करण नियंत्रण में संग्रहित किए जाने पर अधिक बारीक नियंत्रण प्रदान करता है। .Iml फाइलें अभी भी आसपास रहेंगी, इसलिए यह उन में आने वाले यादृच्छिक परिवर्तनों को हल नहीं करता है (हो सकता है कि वे उन्हें स्रोत नियंत्रण से बाहर रखें।), लेकिन कोड शैली और निरीक्षण प्रोफाइल जैसी चीजों को साझा करना आसान है, क्योंकि उनमें से प्रत्येक होगा। .id निर्देशिका के अंतर्गत इसकी अपनी फ़ाइल में।


निर्देशिका-आधारित संरचना में जाने से निश्चित रूप से बहुत मदद मिली। हमने .iml फ़ाइलों को स्रोत नियंत्रण से बाहर निकाल लिया है, जो पहली बार चेक आउट करते समय IDEA को थोड़ा भ्रमित करता है, लेकिन यह अब के लिए सबसे अच्छा समझौता लगता है। हमें टीमन इंस्पेक्शन वर्क ऑफ मावेन फाइल और एक एक्सपोर्टेड इंस्पेक्शन प्रोफाइल भी रखना था, लेकिन हमें वह काम भी मिल गया। धन्यवाद!

लिंक टूट गया है। यह सुनिश्चित नहीं है कि मूल सामग्री क्या थी, लेकिन यहां आईडीईए की परियोजना संरचना पर एक प्रासंगिक डॉक का लिंक दिया गया है। और यहाँ इस विशिष्ट मुद्दे के साथ एक और कड़ी है।
Ben.12

31

आधिकारिक DOC से: http://devnet.jetbrains.com/docs/DOC-1186

IntelliJ IDEA प्रोजेक्ट प्रारूप (.ipr फ़ाइल आधारित या .idea निर्देशिका आधारित) के आधार पर, आपको निम्नलिखित IntelliJ IDEA प्रोजेक्ट फ़ाइलों को संस्करण नियंत्रण में रखना चाहिए:

.ipr फ़ाइल आधारित प्रारूप

प्रोजेक्ट .ipr फ़ाइल और सभी .iml मॉड्यूल फ़ाइलें साझा करें, .iws फ़ाइल साझा न करें क्योंकि यह उपयोगकर्ता की विशिष्ट सेटिंग्स संग्रहीत करता है।

.idea निर्देशिका आधारित प्रारूप

वर्कस्पेस के अलावा प्रोजेक्ट रूट में .idea डायरेक्टरी के अंतर्गत सभी फाइल्स को साझा करें। टाक्स और टास्क को छोड़कर। एक्सएमएल फाइलें जो यूजर की विशिष्ट सेटिंग्स को स्टोर करती हैं, सभी .iml मॉड्यूल फाइल्स को भी साझा करती हैं।

मैंने इसे अपने .gitignore में रखा:

#Project
workspace.xml
tasks.xml

8
हां, और जैसा कि मैंने सवाल में कहा था कि हमने .ipr और .iml और न ही .i साझा किया है। समस्या youtrack.jetbrains.com/issue/IDEA-64312 में मुद्दा है कि .iml फाइलें हर समय बदलती रहती हैं, जिससे बार-बार टकराव होता है। .Iml फ़ाइलों को स्रोत नियंत्रण से बाहर रखना हमारे लिए बेहतर काम करता है, क्योंकि IDEA उन्हें Maven POM से पुन: प्राप्त करता है, और फिर वे अन्य डेवलपर्स के साथ टकराव के बिना स्थानीय रूप से बदलते रह सकते हैं। धन्यवाद!

इस दृष्टिकोण के साथ हमें कुछ संसाधन नामों के साथ समस्या है, उदाहरण के लिए: एंड्रॉइड JDK संस्करण। हमारी टीम के कुछ सदस्यों के पास कॉन्फ़िगर एसडीके के अलग-अलग नाम या अलग-अलग संस्करण हैं। रेपो के लिए प्रोजेक्ट फाइल भेजने के लिए आपको अपनी टीम के साथ उस तरह की चीजों को संरेखित करना होगा। कल तक हमें प्रोज फाइल को रेपो में भेजने के लिए उपयोग नहीं किया गया था, लेकिन यह कठिन हो जाता है क्योंकि हमारी परियोजना बड़ी और कॉन्फ़िगर करने में कठिन हो जाती है।
फेलिप

प्रयुक्त SDKs और सापेक्ष पथों को
एकरूप

1
हाँ। अब हमारे सभी मॉड्यूल "प्रोजेक्ट एसडीके" को इंगित करते हैं, और हम उसी एसडीके का उपयोग करने के लिए टीम के साथ संरेखित करते हैं। कम से कम संशोधित करने के लिए सिर्फ एक जगह है। लेकिन इंटेलीज बेहतर कर सकती थी।
फेलिप

23

एक आधिकारिक उत्तर उपलब्ध है । मान लें कि आप आधुनिक (और अब डिफ़ॉल्ट) .ideaफ़ोल्डर प्रोजेक्ट प्रारूप का उपयोग कर रहे हैं :

  • सब कुछ जोड़ें ...
  • के सिवाय .idea/workspace.xml (जो उपयोगकर्ता-विशिष्ट है)
  • के सिवाय .idea/tasks.xml (जो उपयोगकर्ता-विशिष्ट है)
  • कुछ अन्य फ़ाइलों को छोड़कर, जिनमें पासवर्ड / कुंजी / आदि हो सकते हैं (विवरण के लिए उपरोक्त लिंक देखें)

यह नमूना .gitignore फ़ाइल एक उपयोगी संदर्भ हो सकती है, हालांकि आपको यह समझने के लिए उपरोक्त लिंक अभी भी पढ़ना चाहिए कि ये प्रविष्टियाँ क्यों दिखाई देती हैं और तय करती हैं कि उन्हें उनकी आवश्यकता है या नहीं।

व्यक्तिगत रूप से मैं .idea/find.xmlफ़ाइल को भी अनदेखा कर देता हूं क्योंकि ऐसा लगता है कि हर बार जब आप खोज ऑपरेशन करते हैं तो बदल जाते हैं।


1
"नमूना gitignore फ़ाइल" लिंक के आधार पर, मैं इसे एक कदम आगे ले जाऊंगा और मुझे खुशी है कि आपने इसे प्रदान किया। आधारित पते पर जाएं और आप "पूर्ण" gitignore प्राप्त करने के लिए विभिन्न प्रकारों को जोड़ सकते हैं। मेरे एंड्रॉइड प्रोजेक्ट के लिए, जो स्पष्ट रूप से जावा, एंड्रॉइड, एक्लिप्स, इंटेलीज
WernerCD

16

मैंने स्रोत नियंत्रण से बाहर कार्यक्षेत्र। Xml लिया (+ .ignignore में जोड़ा)।


10

हमारी टीम पथ-विशिष्ट IntelliJ फ़ाइलों की जांच नहीं करती है। हम मानते हैं कि लोग जानते हैं कि आईडीई का उपयोग कैसे करना है और एक परियोजना स्थापित करना है। IntelliJ फाइलें 'अनदेखा' परिवर्तन सूची में जाती हैं।

अपडेट करें:

इसका उत्तर अब आसान है कि मैं मावेन और इसकी डिफ़ॉल्ट निर्देशिका संरचना का उपयोग कर रहा हूं।

IntelliJ में सभी फ़ाइलों की अनदेखी करने के लिए कहा जाना चाहिए /.svn, /.ideaऔर /targetफ़ोल्डरों। किसी व्यक्ति की पथ जानकारी से संबंधित हर चीज में संग्रहीत होती है/.idea

बाकी सब कुछ उचित खेल है जो तोड़फोड़ या जीत के लिए प्रतिबद्ध है।


14
परियोजना की स्थापना करना कोई बड़ी बात नहीं है क्योंकि यह अक्सर नहीं होता है, लेकिन यह बहुत आसान है कि बिल्ड कॉन्फ़िगरेशन और निरीक्षण प्रोफाइल साझा करने में सक्षम हो।

1
उस सामान की जाँच करें जो किसी व्यक्ति के मार्ग पर निर्भर नहीं है।
duffymo

2

बस एक अन्य दृष्टिकोण को साझा करने के लिए जो मेरी टीम ने उपयोग किया है: बस जो भी IDE संबंधित फ़ाइलों को एक अलग स्थान पर ले जाएं जहां IntelliJ पहचान नहीं करता है, और उन्हें वांछित 'सक्रिय' स्थान पर कॉपी करने के लिए एक स्क्रिप्ट बनाएं, जिसे GIT द्वारा अनदेखा किया गया है।

इस दृष्टिकोण का लाभ यह है कि आपने आईडीई सेटिंग्स को संस्करण नियंत्रण के माध्यम से साझा करने का विकल्प रखा। एकमात्र दोष यह है कि आपको यह तय करना होगा कि स्क्रिप्ट को चलाने के लिए (शायद एक बार कार्यक्षेत्र क्लोन के अनुसार या जब परिवर्तन वांछित हो), और आप अपनी बिल्ड प्रक्रिया या पोस्ट-मर्ज हुक में स्क्रिप्ट को शामिल करके इसे स्वचालित कर सकते हैं।

यह दृष्टिकोण इस पर निर्भर करता है कि इंटेलीजे अपनी सेटिंग फ़ाइलों के लिए केवल विशेष स्थानों की खोज करता है, इसलिए यह फ्रेमवर्क कॉन्फ़िगरेशन फ़ाइलों के साथ भी लागू होता है। वास्तव में हमने ग्रिल्स को नजरअंदाज कर दिया है। ठीक उसी तरह से फाइल करें, ताकि डेवलपर्स गलती से अपने स्थानीय कॉन्फ़िगरेशन परिवर्तनों की जांच न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.