ฉันทำงานกับแอปพลิเคชัน iPhone เต็มเวลาตั้งแต่เปิดตัว SDK เวลาส่วนใหญ่ใช้เวลาทำงานในทีมกับนักพัฒนาหลายคน
ความจริงก็คือการไม่อนุญาตให้รวมไฟล์. pbxproj นั้นเป็นอันตรายมากกว่าที่จะเป็นประโยชน์ อย่างที่คุณพูดเมื่อคุณเพิ่มไฟล์เว้นแต่คนอื่นจะได้รับไฟล์นั้นพวกเขาจะต้องเพิ่มไฟล์ลงในโปรเจ็กต์ของพวกเขาด้วย - ในแอปพลิเคชันขนาดใดก็ได้ที่ห่วยและยังทำให้คุณได้รับประโยชน์อย่างมากจากการควบคุมซอร์สโค้ดในตัวคุณ ไม่สามารถเปลี่ยนกลับเป็นสถานะโปรเจ็กต์ก่อนหน้านี้ได้อย่างสมบูรณ์โดยใช้คอมไพล์
ไฟล์. pbxproj เป็นเพียงรายการคุณสมบัติ (คล้ายกับ XML) จากประสบการณ์ความขัดแย้งในการผสานเพียงอย่างเดียวที่คุณเคยได้รับคือถ้ามีคนสองคนเพิ่มไฟล์ในเวลาเดียวกัน วิธีแก้ปัญหาใน 99% ของกรณีความขัดแย้งในการผสานคือการเก็บทั้งสองด้านของการผสานซึ่งอย่างน้อยก็เกี่ยวข้องกับการลบ >>>>, <<<< และ ==== บรรทัดใด ๆ อันที่จริงนี่เป็นเรื่องธรรมดามากที่ฉันได้สร้างเชลล์สคริปต์อย่างง่ายเพื่อแก้ไขไฟล์. pbxproj ในสถานะผสานจาก git ฉันเรียกใช้สิ่งนี้จากภายในไดเร็กทอรีโปรเจ็กต์ (ที่ระดับคลาส):
#!/bin/sh
projectfile=`find -d . -name 'project.pbxproj'`
projectdir=`echo *.xcodeproj`
projectfile="${projectdir}/project.pbxproj"
tempfile="${projectdir}/project.pbxproj.out"
savefile="${projectdir}/project.pbxproj.mergesave"
cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile
cp $projectfile $savefile
mv $tempfile $projectfile
ในกรณีที่แย่ที่สุดหากล้มเหลว (คุณขอให้ XCode โหลดโปรเจ็กต์ แต่ไม่สามารถโหลดได้) คุณเพียงแค่ลบไฟล์. pbxproj ตรวจสอบต้นแบบจาก git และเพิ่มไฟล์ของคุณใหม่ แต่ฉันไม่เคยมีสิ่งนั้นเกิดขึ้นในช่วงหลายเดือนของการใช้งานกับสคริปต์นี้อีกครั้งทำงานเต็มเวลาบนแอปพลิเคชัน iPhone กับนักพัฒนารายอื่น ๆ
อีกทางเลือกหนึ่ง (ระบุไว้ในความคิดเห็นด้านล่าง) ที่คุณสามารถลองใช้แทนสคริปต์ได้คือการเพิ่มบรรทัดนี้ในไฟล์. gitattributes:
*.pbxproj text -crlf -diff -merge=union
จากนั้นคอมไพล์จะใช้ทั้งสองด้านของการผสานสำหรับไฟล์. pbxproject โดยมีผลเช่นเดียวกับสคริปต์ที่ฉันให้ไว้เท่านั้นโดยไม่ต้องทำงานพิเศษใด ๆ
สุดท้ายนี่คือไฟล์. gitignore ที่สมบูรณ์ของฉันซึ่งแสดงสิ่งที่ฉันตั้งไว้ให้เพิกเฉยเนื่องจากมีบางสิ่งที่คุณไม่ต้องการ - ในกรณีของฉันมีเพียงแค่ emacs ที่เหลือและไดเร็กทอรี build ทั้งหมด:
# xcode noise
build