วิธีจัดการกับไฟล์โครงการ IntelliJ IDEA ภายใต้การควบคุมแหล่ง Git เปลี่ยนแปลงตลอดเวลา?


151

ทุกคนในทีมของเราใช้ IntelliJ IDEA และเราพบว่ามีประโยชน์ที่จะนำไฟล์โครงการ (.ipr และ. iml) ไปไว้ในการควบคุมซอร์สเพื่อให้เราสามารถแบ่งปันการกำหนดค่าการตั้งค่าและการตรวจสอบ นอกจากนี้เราสามารถใช้การตั้งค่าการตรวจสอบเหล่านั้นบนเซิร์ฟเวอร์รวมอย่างต่อเนื่องของเรากับ TeamCity (เรามีไฟล์. wi พื้นที่ทำงานต่อผู้ใช้ในไฟล์. gitignore และไม่ได้อยู่ในการควบคุมแหล่งที่มา)

อย่างไรก็ตามไฟล์เหล่านั้นเปลี่ยนไปเล็กน้อยเมื่อคุณทำอะไรก็ได้ในไอเดีย มีปัญหาในฐานข้อมูลปัญหาของ IDEA สำหรับมัน ( IDEA-64312 ) ดังนั้นอาจมีใครคิดว่าจุดบกพร่องนี้ใน IDEA แต่มันเป็นสิ่งที่เราจะต้องอยู่ด้วยในอนาคตอันใกล้

จนกระทั่งเมื่อเร็ว ๆ นี้เรากำลังใช้การโค่นล้ม แต่เราเพิ่งเปลี่ยนเป็น Git เราแต่ละคนเพิ่งคุ้นเคยกับการเปลี่ยนแปลงรายการไฟล์โครงการที่เราเพิกเฉยและไม่ได้เช็คอินเว้นแต่จะมีการเปลี่ยนแปลงไฟล์โครงการที่เราต้องการแบ่งปันกับคนอื่น ๆ แต่ด้วย Git พลังที่แท้จริงดูเหมือนจะเป็น (จากสิ่งที่เรากำลังสำรวจ) การแตกกิ่งก้านสาขาอย่างต่อเนื่องที่กระตุ้นและการสลับระหว่างกิ่งเป็นความเจ็บปวดกับไฟล์โครงการที่มีการแก้ไขอยู่เสมอ บ่อยครั้งที่มันสามารถรวมในการเปลี่ยนแปลงอย่างใดอย่างหนึ่งและพยายามที่จะจัดการกับการเปลี่ยนแปลงไฟล์โครงการตอนนี้ถูกนำไปใช้กับสาขาใหม่ อย่างไรก็ตามหากสาขาใหม่มีการเปลี่ยนแปลงไฟล์โครงการ (เช่นสาขากำลังทำงานกับโมดูลใหม่ที่ยังไม่ได้อยู่ในสาขาอื่น) git เพียงแค่โยนข้อผิดพลาดที่มันไม่ได้ ' ไม่มีเหตุผลใดที่จะรวมในไฟล์เมื่อทั้งสองสาขามีการเปลี่ยนแปลงและคุณมีการเปลี่ยนแปลงในเครื่องและฉันสามารถเข้าใจประเด็นได้ จากบรรทัดคำสั่งหนึ่งสามารถใช้ "-f" ในคำสั่ง "git checkout" เพื่อบังคับให้เปลี่ยนการเปลี่ยนแปลงในพื้นที่และใช้สาขาแทน แต่ (1) คำสั่ง Git Checkout GUI ใน IDEA (10.5.1) ดูเหมือนจะไม่มีตัวเลือกนั้นเราสามารถค้นหาได้ดังนั้นเราจึงต้องเปลี่ยนไปใช้บรรทัดคำสั่งเป็นประจำและ (2) เราไม่แน่ใจว่าเราต้องการที่จะใช้มัน ตั้งค่าสถานะและบอก Git ให้ยกเลิกการเปลี่ยนแปลงในท้องถิ่นของเรา

ดังนั้นนี่คือความคิดบางอย่างที่เรามีในตัวเลือกที่เราต้องจัดการกับเรื่องนี้:

  1. นำไฟล์โครงการออกจากการควบคุมแหล่งที่มาทั้งหมด วางไว้ใน. gitignore และแจกจ่ายให้แต่ละคนและ TeamCity ผ่านวิธีการอื่น ๆ โดยอาจวางไว้ในการควบคุมแหล่งที่อื่นหรือภายใต้ชื่ออื่น ทีมของเรามีขนาดเล็กพอตัวเลือกนี้มีความเป็นไปได้พอที่จะพิจารณา แต่ดูเหมือนจะไม่ดี
  2. ใช้ชีวิตต่อไปกับมันพยายามให้แน่ใจว่าจัดการไฟล์ที่เรามีซึ่งสาขาตามเวลาที่กำหนด ในส่วนนี้เราอาจสนับสนุนให้นักพัฒนาแต่ละคนมีมากกว่าหนึ่งสำเนาของแต่ละโครงการในระบบของพวกเขาเพื่อให้พวกเขาสามารถเช็คเอาต์แต่ละสาขาที่แตกต่างกันด้วยชุดไฟล์โครงการที่แตกต่างกัน
  3. ลองมีเพียงโครงการ (.ipr) ในการควบคุมแหล่งที่มาด้วยไฟล์โมดูล (.iml) ไม่ได้อยู่ในการควบคุมแหล่งที่มาและในไฟล์. gitignore สิ่งสำคัญที่ดูเหมือนจะสลับด้วยตัวเองใน. ipr เป็นประจำคือคำสั่งของการกำหนดค่าการสร้างที่ใช้ร่วมกัน แต่บางทีเราก็สามารถแบ่งปันข้อมูลแยกต่างหากเกี่ยวกับวิธีการตั้งค่าเหล่านั้น ฉันค่อนข้างไม่แน่ใจว่า IDEA เกี่ยวข้องกับประเภทนี้เพียงแค่มีไฟล์บางส่วนเท่านั้นโดยเฉพาะอย่างยิ่งในการชำระเงินใหม่

ฉันเดาว่าฉันหวังว่าจะมีวิธีแก้ปัญหาที่ชัดเจน (หรือไม่ชัดเจน) ที่เราพลาดไปบางทีอาจเกี่ยวข้องกับความสามารถในการปรับแต่งขนาดใหญ่ที่ Git และ IDEA ทั้งคู่ดูเหมือนจะมี แต่ดูเหมือนว่าเราไม่อาจเป็นทีมเดียวที่มีปัญหานี้ คำถามที่คล้ายกันใน Stack Overflow รวมถึง3495191 , 1000512และ3873872แต่ฉันไม่รู้ว่าพวกเขาเป็นปัญหาเดียวกันและบางทีใครบางคนอาจเกิดข้อดีและข้อเสียสำหรับวิธีการต่าง ๆ ที่ฉันได้รับ วิธีการที่ระบุไว้ในคำตอบของคำถามเหล่านั้นหรือแนวทางที่พวกเขาแนะนำ


2
ดูstackoverflow.com/questions/3041154/ … -> คำถามที่พบบ่อยเกี่ยวกับ IDEA: devnet.jetbrains.com/docs/DOC-1186
Matthew Cornell

คำตอบด้านล่างให้ gitignore.io เป็นฐานที่ดี ฉันพบว่ามีประโยชน์แม้ว่าสามปีหลังจากความจริง: gitignore.io/api/java,android,eclipse,intellij
WernerCD

โปรดทราบว่าปัญหา IDEA youtrack.jetbrains.com/issue/IDEA-64312 ที่ฉันพูดถึงถูกทำเครื่องหมายว่าได้รับการแก้ไขใน IntelliJ IDEA 14 ดังนั้นผู้ที่ใช้รุ่นล่าสุดและต้องการเก็บไฟล์ไว้ในแหล่งควบคุมอาจมีเวลามากขึ้นในตอนนี้ กว่าเวลาที่ฉันโพสต์คำถามนี้

คำตอบ:


48

คุณสามารถใช้โครงสร้างโครงการตามไดเรกทอรีของ IDEA ซึ่งการตั้งค่าจะถูกเก็บไว้ในไดเรกทอรี. aide แทนที่จะเป็นไฟล์. ipr มันให้การควบคุมที่ละเอียดยิ่งกว่าสิ่งที่เก็บไว้ในการควบคุมเวอร์ชัน ไฟล์. iml จะยังคงอยู่รอบ ๆ ดังนั้นจึงไม่สามารถแก้ไขการเปลี่ยนแปลงแบบสุ่ม (อาจทำให้พวกมันอยู่นอกการควบคุมของแหล่งที่มา?) แต่การแชร์สิ่งต่าง ๆ เช่นรูปแบบโค้ดและโปรไฟล์การตรวจสอบเป็นเรื่องง่ายเนื่องจากแต่ละไฟล์จะเป็น ในไฟล์ของตัวเองภายใต้ไดเรกทอรี .idea


การย้ายไปยังโครงสร้างฐานข้อมูลช่วยได้มาก เรานำไฟล์. iml ออกจากการควบคุมซอร์สซึ่งทำให้ IDEA สับสนเล็กน้อยเมื่อเช็คเอาต์เป็นครั้งแรก แต่ตอนนี้ดูเหมือนจะเป็นการประนีประนอมที่ดีที่สุด นอกจากนี้เรายังต้องให้การตรวจสอบ TeamCity ปิดการทำงานของไฟล์ Maven และโปรไฟล์การตรวจสอบที่ส่งออกด้วย ขอบคุณ!

ลิงก์เสีย ไม่แน่ใจว่าเนื้อหาต้นฉบับคืออะไร แต่นี่คือลิงค์ไปยังเอกสารที่เกี่ยวข้องในโครงสร้างโครงการของ IDEA และนี่คือลิงค์อื่นที่เกี่ยวข้องกับปัญหาเฉพาะนี้
Ben.12

31

จาก DOC อย่างเป็นทางการ: http://devnet.jetbrains.com/docs/DOC-1186

ขึ้นอยู่กับรูปแบบโปรเจ็กต์ IntelliJ IDEA (ไฟล์. ipr หรือไฟล์. ida) คุณควรใส่ไฟล์โปรเจ็กต์ IntelliJ IDEA ต่อไปนี้ภายใต้การควบคุมเวอร์ชัน:

รูปแบบไฟล์. ipr

แชร์ไฟล์โครงการ. ipr และไฟล์โมดูล. img ทั้งหมดอย่าแชร์ไฟล์. ivs เนื่องจากเก็บการตั้งค่าเฉพาะของผู้ใช้

รูปแบบที่ใช้. directory ในไดเรกทอรี

แบ่งใช้ไฟล์ทั้งหมดภายใต้ไดเร็กทอรี .idea ในรูทโปรเจ็กต์ยกเว้นไฟล์ workspace.xml และ task.xml ซึ่งเก็บการตั้งค่าเฉพาะผู้ใช้รวมถึงไฟล์โมดูล. img ทั้งหมด

ฉันใส่ไว้ใน. gitignore ของฉัน:

#Project
workspace.xml
tasks.xml

8
ใช่และอย่างที่ฉันพูดในคำถามเราแบ่งปัน. ipr และ. iml และไม่ใช่. ivs ปัญหาคือปัญหาในyoutrack.jetbrains.com/issue/IDEA-64312ว่าไฟล์. iml เปลี่ยนแปลงตลอดเวลาซึ่งนำไปสู่ความขัดแย้งที่พบบ่อย การเก็บไฟล์. img ออกจากการควบคุมซอร์สดูเหมือนว่าจะทำงานได้ดีขึ้นสำหรับเราเนื่องจาก IDEA จะสร้างไฟล์เหล่านั้นใหม่จาก Maven POM จากนั้นพวกเขาก็สามารถเปลี่ยนแปลงภายในเครื่องได้โดยไม่ขัดแย้งกับผู้พัฒนารายอื่น ขอบคุณ!

ด้วยวิธีการนี้เรามีปัญหากับชื่อทรัพยากรบางอย่างเช่น: Android JDK เวอร์ชั่น สมาชิกในทีมของเราบางคนมีชื่อแตกต่างกันหรือเป็นเวอร์ชั่นอื่นสำหรับ SDK ที่กำหนดค่าไว้ การส่งไฟล์โครงการไปยัง repo คุณต้องจัดเรียงสิ่งนั้นกับทีมของคุณ จนกระทั่งเมื่อวานเราไม่ได้ใช้ในการส่งไฟล์โพรเจเพื่อซื้อคืน แต่มันยากเพราะโครงการของเรามีขนาดใหญ่และยากที่จะกำหนดค่า
เฟลิเป้

การรวม SDK ที่ใช้แล้วและเส้นทางสัมพัทธ์เป็นวิธีที่ง่ายและมีประสิทธิภาพ
Kumait

1
ใช่. ตอนนี้โมดูลทั้งหมดของเราชี้ไปที่ "Project SDK" และเราปรับให้เข้ากับทีมเพื่อใช้ SDK เดียวกัน อย่างน้อยก็เป็นเพียงที่เดียวที่จะแก้ไข แต่ IntelliJ สามารถทำได้ดีกว่า
เฟลิเป้

23

คำตอบอย่างเป็นทางการใช้ได้ สมมติว่าคุณกำลังใช้.ideaรูปแบบโครงการโฟลเดอร์ที่ทันสมัย ​​(และตอนนี้เริ่มต้น) :

  • เพิ่มทุกอย่าง ...
  • ยกเว้น.idea/workspace.xml(ซึ่งเป็นข้อมูลเฉพาะของผู้ใช้)
  • ยกเว้น.idea/tasks.xml(ซึ่งเป็นข้อมูลเฉพาะของผู้ใช้)
  • ยกเว้นบางไฟล์อื่น ๆ ที่อาจมีรหัสผ่าน / คีย์ / ฯลฯ (ดูลิงค์ด้านบนเพื่อดูรายละเอียด)

ไฟล์. gitignore ตัวอย่างนี้อาจเป็นข้อมูลอ้างอิงที่มีประโยชน์ถึงแม้ว่าคุณควรอ่านลิงก์ด้านบนเพื่อทำความเข้าใจว่าเหตุใดข้อมูลเหล่านี้จึงปรากฏขึ้นและตัดสินใจว่าคุณต้องการอะไร

ส่วนตัวแล้วฉันก็เพิกเฉยต่อ.idea/find.xmlไฟล์เพราะมันดูเหมือนว่าจะเปลี่ยนแปลงทุกครั้งที่คุณทำการค้นหา


1
จากลิงก์ "ตัวอย่างไฟล์ gitignore" ฉันจะทำขั้นตอนต่อไปและดีใจที่คุณได้ให้สิ่งนี้ ไปที่ที่อยู่ตามและคุณสามารถรวมประเภทที่แตกต่างกันเพื่อรับ gitignore "เต็ม" สำหรับโครงการ Android ของฉันซึ่งใช้อย่างชัดเจน, Java, Android, Eclipse, IntelliJ: gitignore.io/api/java,android,eclipse,intellij
WernerCD


10

ทีมของเราไม่ได้เช็คอินไฟล์ IntelliJ เฉพาะพา ธ เราคิดว่าผู้คนรู้วิธีใช้ IDE และตั้งค่าโครงการ ไฟล์ IntelliJ เข้าสู่รายการเปลี่ยนแปลง 'ละเว้น'

UPDATE:

คำตอบนั้นง่ายกว่าตอนนี้ที่ฉันใช้ Maven และโครงสร้างไดเรกทอรีเริ่มต้น

IntelliJ ควรจะถามจะไม่สนใจไฟล์ทั้งหมดใน/.svn, /.ideaและ/targetโฟลเดอร์ /.ideaทุกอย่างที่เกี่ยวข้องกับข้อมูลเส้นทางของแต่ละคนจะถูกเก็บไว้ใน

ทุกอย่างเป็นเกมที่ยุติธรรมที่จะมุ่งมั่นที่จะโค่นล้มหรือ Git


14
การตั้งค่าโครงการไม่ใช่เรื่องใหญ่เพราะมันไม่ได้เกิดขึ้นบ่อยครั้ง แต่มีประโยชน์มากที่จะสามารถแชร์การกำหนดค่าการสร้างและโปรไฟล์การตรวจสอบโดยไม่ต้องใช้หน้าจออีเมลหรือบางสิ่งบางอย่าง

1
ตรวจสอบสิ่งที่ไม่ได้ขึ้นอยู่กับเส้นทางของแต่ละบุคคล
duffymo

2

แบ่งปันวิธีอื่นที่ทีมของฉันใช้: เพียงย้ายไฟล์ IDE ที่เกี่ยวข้องไปยังตำแหน่งอื่นที่ IntelliJ ไม่รู้จักและสร้างสคริปต์เพื่อคัดลอกไปยังตำแหน่ง 'แอคทีฟ' ที่ต้องการโดย GIT

ประโยชน์ของวิธีนี้คือคุณเก็บตัวเลือกในการแบ่งปันการตั้งค่า IDE ผ่านการควบคุมเวอร์ชัน ข้อเสียเปรียบเพียงอย่างเดียวคือคุณต้องตัดสินใจว่าเมื่อใดที่จะเรียกใช้สคริปต์ (อาจหนึ่งครั้งต่อการโคลนพื้นที่ทำงานหรือเมื่อต้องการให้มีการเปลี่ยนแปลง) และคุณสามารถทำให้สิ่งนี้เป็นแบบอัตโนมัติโดยการรวมสคริปต์ในกระบวนการสร้างของคุณ

วิธีการนี้ขึ้นอยู่กับ IntelliJ ที่ค้นหาเฉพาะสถานที่ตั้งของแฟ้มการตั้งค่าดังนั้นจึงใช้กับแฟ้มการกำหนดค่ากรอบงานด้วย ที่จริงแล้วเราเพิกเฉยต่อไฟล์. คุณสมบัติของ Grails ในลักษณะเดียวกันดังนั้นนักพัฒนาจะไม่ตรวจสอบการเปลี่ยนแปลงการกำหนดค่าท้องถิ่นโดยไม่ตั้งใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.