จะใช้ Git อย่างถูกต้องกับ Xcode ได้อย่างไร?


94

ฉันเป็นนักพัฒนา iPhone มาระยะหนึ่งแล้วและเมื่อเร็ว ๆ นี้ฉันได้รวมคอมไพล์ไว้ในเวิร์กโฟลว์ของฉัน ฉันใช้การตั้งค่าคอมไพล์ที่พบในhttp://shanesbrain.net/2008/7/9/using-xcode-with-gitสำหรับเวิร์กโฟลว์ของฉันจนถึงตอนนี้

การตั้งค่าเหล่านี้บอกให้ git ยกเว้น * .pbxproj จากการผสาน? มีเหตุผลที่แท้จริงในการทำเช่นนี้หรือไม่? ตัวอย่างเช่นเมื่อฉันเพิ่มไฟล์ลงในโปรเจ็กต์และพุชไปยังจุดเริ่มต้นนักพัฒนาคนอื่น ๆ ของฉันจะไม่มีไฟล์นั้นเพิ่มในโปรเจ็กต์ xcode ของพวกเขาเมื่อพวกเขาดึง จากนั้นหากหนึ่งในนั้นสร้างรุ่นไฟล์นี้อาจไม่รวมอยู่ด้วย ฉันควรปล่อยให้คอมไพล์จัดการการผสานสำหรับไฟล์โปรเจ็กต์ไม่ใช่หรือ เหตุใดจึงไม่ควรผสานไฟล์นี้และวิธีจัดการกับสถานการณ์อย่างเหมาะสมเมื่อมีการเพิ่มไฟล์ลงในโครงการ


9
ฉันไม่ได้ทำงานกับ XCode แต่ถ้าไฟล์ * .pbxproj เป็นอะไรก็ได้เช่นไฟล์ * .csproj ของ Visual Studio (รายการไฟล์บางส่วน) การตั้งค่านี้ดูเหมือนจะค่อนข้างงี่เง่าสำหรับฉัน ดูเหมือนว่ามีคนเบื่อกับการผสานความขัดแย้งเมื่อคนสองคนเพิ่มไฟล์ลงในโครงการและคิดว่าทางออกที่ดีที่สุดคือการทำให้ทุกอย่าง
เสียหาย

ปัญหาเกี่ยวกับ XCode (ไม่แน่ใจเกี่ยวกับ Visual Studio) คือไฟล์. pbxproj แทบจะไม่สามารถอ่านได้โดยมนุษย์ดังนั้นจึงไม่สมเหตุสมผลที่จะแก้ไขข้อขัดแย้งด้วยมือ
ทอม

7
* ไฟล์. pbxproj มีโครงสร้างที่ค่อนข้างดีคุณแค่มีระยะยาวระหว่างส่วนท้ายของบล็อกและส่วนเริ่มต้น ความสง่างามในการประหยัดคือไฟล์มีการแบ่งบรรทัดที่วางไว้อย่างดีดังนั้นจึงยากที่จะทำให้ยุ่งเหยิงเพียงแค่ปรับเปลี่ยนบรรทัดและระบบอัตโนมัติโดยทั่วไปจะทำงานได้ดีมาก นอกจากนี้ยังหมายความว่าโดยทั่วไปบล็อกการผสานนั้นเข้าใจง่ายคุณสามารถมองเห็นด้านหนึ่งโดยมีการเพิ่มไฟล์สองสามชุดและอีกด้านหนึ่งจะมีการเพิ่มชุดไฟล์ต่างๆ
Kendall Helmstetter Gelner

คำตอบ:


136

ฉันทำงานกับแอปพลิเคชัน 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/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile

3
คุณใช้ไฟล์. gitattributes สำหรับโครงการ xcode ของคุณหรือไม่? และขอขอบคุณสำหรับข้อมูลเชิงลึก ฉันคิดว่ามันจะง่ายกว่ามากที่จะลองรวมไฟล์ pbxproj ในอนาคต
rickharrison

1
จนถึงปัจจุบันเรายังไม่เคยแม้ว่าบางแง่มุมของสิ่งนั้นจะดูน่าสนใจ แต่คนที่ฉันทำงานด้วยไม่ได้เป็นผู้ใช้คอมไพล์ขั้นสูงดังนั้นการสนับสนุนคุณลักษณะขั้นสูงจึงไม่แข็งแรง
Kendall Helmstetter Gelner

1
“ ไฟล์. pbxproj เป็นเพียง JSON (คล้ายกับ XML)” จริงๆแล้วมันคือรายการคุณสมบัติที่จัดรูปแบบ OpenStep แนวคิดพื้นฐานเช่นเดียวกับ JSON แต่ไวยากรณ์แตกต่างกันในบางที่
Peter Hosey

1
อีกอย่างที่ต้องลอง - set merge = union: stackoverflow.com/questions/2729109/…
Kendall Helmstetter Gelner

1
ผมเห็นด้วยกับ @KendallHelmstetterGelner แทนการใช้สคริปต์ของคุณที่เอาสายพิเศษที่คุณสามารถอัปเดต .gitattribute ของคุณด้วยสวิทช์:union *.pbxproj text/plain -crlf -diff -merge union
Besi

9

สิ่งนี้ใช้ได้กับฉันใน Xcode 4.6 และ Git 1.7.5

เพิ่มและคอมมิตไฟล์. gitattributes ด้วยสิ่งนี้:

*.pbxproj binary merge=union

ฉันได้ทดสอบกับสมาชิกในทีมคนอื่นแล้วและใช้งานได้ดี

นำมาจาก: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap


Merge = union นั้นดี แต่เครื่องมือ mergepbx ควรเป็นคำตอบที่ยอมรับ
Alper

8

ตรงไปตรงมาคำตอบที่มีอยู่ทำให้เข้าใจผิด

หากคุณไม่เคยลบหรือเปลี่ยนชื่อไฟล์การใช้merge=unionกลยุทธ์ซึ่งเพียงแค่รวมความแตกต่างในการกระทำที่แตกต่างกันโดยตรงก็เป็นความคิดที่ดี

อย่างไรก็ตามในโลกแห่งความเป็นจริงเราจำเป็นต้องลบหรือเปลี่ยนชื่อไฟล์ในบางครั้ง การผสานความแตกต่างโดยไม่มีการปรับเปลี่ยนใด ๆ จะทำให้เกิดปัญหามากมายภายใต้สถานการณ์เหล่านี้และปัญหาเหล่านี้มักนำไปสู่ปัญหา "Workspace Integrity - ไม่สามารถโหลดโปรเจ็กต์" ซึ่งทำให้คุณไม่สามารถเรียกใช้โครงการได้

ทางออกที่ดีที่สุดที่ฉันได้รับ:

1) ออกแบบโครงการให้ดีและเพิ่มไฟล์ที่จำเป็นทั้งหมดในตอนเริ่มต้นดังนั้นคุณแทบไม่จำเป็นต้องเปลี่ยนไฟล์project.pbxproj.

2) ทำให้คุณสมบัติของคุณเล็กลง อย่าทำหลายอย่างในสาขามากเกินไป

3) ไม่ว่าด้วยเหตุผลใดก็ตามหากคุณต้องการแก้ไขโครงสร้างไฟล์และเกิดข้อขัดแย้งproject.pbxprojให้ใช้โปรแกรมแก้ไขข้อความที่คุณชื่นชอบเพื่อแก้ไขด้วยตนเอง ในขณะที่คุณทำงานเล็ก ๆ น้อย ๆ ความขัดแย้งอาจแก้ได้ง่าย


3

คำตอบสั้น ๆ คือแม้ว่าคุณจะไม่รวมบรรทัดนั้นไว้.gitattributesแต่คุณอาจไม่สามารถผสาน. pbxproj เวอร์ชันแก้ไขสองเวอร์ชันได้อย่างง่ายดาย มันจะดีกว่าสำหรับ git ที่จะถือว่ามันเป็นไบนารี

ดูรายละเอียดที่นี่: Git และ pbxproj

อัปเดต:แม้ว่าหนังสือคอมไพล์ยังคงเห็นด้วยกับคำตอบนี้ แต่ฉันก็ไม่ทำอีกต่อไป ฉันควบคุมเวอร์ชันของฉัน.pbxprojเหมือนกับซอร์สไฟล์ที่ไม่ใช่ไบนารีอื่น ๆ


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

1
ไม่ใช่ไฟล์ที่จัดรูปแบบ JSON ดูคล้ายกัน แต่มีความแตกต่างในรายละเอียดมากมาย
eonil

มันบอกว่า JSON ใน git book แต่ดูเหมือนจะผิด git-scm.com/book/ch7-2.html
huggie

1
ตกลง. .pbxprojไฟล์นี้เป็นไฟล์ NeXT / Cocoa PList แบบเก่าซึ่งเก่ากว่าและกำหนดไว้ก่อนหน้า JSON มากและตอนนี้ Apple เลิกใช้แล้ว (แต่ยังคงใช้อยู่ในบางสถานที่) การกล่าวถึงไฟล์ในหนังสือเล่มนี้ไม่ถูกต้อง ฉันลบการโหวตออกเนื่องจากคุณพูดถึงเรื่องนี้อย่างชัดเจน
eonil

2

ฉันสร้างสคริปต์ Python ที่สามารถจัดการความขัดแย้งในการผสานในไฟล์ XCode Project

หากคุณต้องการลองคุณสามารถตรวจสอบได้ที่นี่: https://github.com/simonwagner/mergepbx

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

ควรทำงานได้ดีกว่าการใช้merge=unionตามmergepbxความเข้าใจความหมายของไฟล์โครงการของคุณดังนั้นจึงจะแก้ไขข้อขัดแย้งได้อย่างถูกต้อง

อย่างไรก็ตามโปรเจ็กต์ยังคงเป็นอัลฟ่าอย่าคาดหวังว่ามันจะเข้าใจไฟล์โปรเจ็กต์ทั้งหมดที่มีอยู่

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