Як правильно використовувати Git з Xcode?


94

Я деякий час був розробником iphone, і останнім часом я включаю git у свій робочий процес. Я використовував налаштування git, знайдені на веб-сайті http://shanesbrain.net/2008/7/9/using-xcode-with-git для свого робочого процесу.

Ці налаштування кажуть git виключати * .pbxproj зі злиття? Чи є реальна причина для цього? Наприклад, коли я додаю файл до проекту та натискаю на початкове джерело, мої колеги-розробники не будуть додавати цей файл до свого проекту xcode, коли вони тягнуть. Тоді, якщо одна з них будує реліз, цей файл може не включатися. Чи не варто мені просто дозволити git обробляти злиття для файлу проекту? Чому чи чому цей файл не повинен бути об'єднаним і як правильно впоратися з ситуацією, коли файли додаються до проекту?


9
Я не працюю з XCode, але якщо файли * .pbxproj схожі на файли * .csproj Visual Studio (дещо з переліку файлів), ця настройка мені здається досить ідіотичною. Здається, що хтось втомився від конфліктів між злиттями, коли двоє людей додали файли до проекту і подумали, що найкращим рішенням буде все
накрутити

Проблема з XCode (не впевнений у Visual Studio) полягає в тому, що файли .pbxproj ледь читаються людиною, тому не має сенсу вирішувати конфлікти вручну.
Том

7
* .pbxproj файли насправді досить добре структуровані, у вас просто довгі простягання між блочним кінцем та початковим сегментами. Благодатність економії полягає в тому, що у файлі дуже добре розміщені розриви рядків, тому важко зіпсувати його, просто модифікуючи рядки, і автоматичний сервіс зазвичай працює дуже добре. Це також означає, що блоки злиття, як правило, легко зрозуміти - ви можете бачити одну сторону з додаванням декількох наборів файлів, другу - з різними наборами файлів.
Kendall Helmstetter Gelner

Відповіді:


136

Я працював над додатками iPhone повний робочий день з моменту запуску SDK, більшу частину цього часу витратив на роботу над командами з кількома розробниками.

Правда полягає в тому, що заборонити об'єднання цього .pbxproj-файлу набагато шкідливіше, ніж це корисно. Як ви говорите, коли ви додаєте файл, якщо інші люди не отримують цей файл, вони також повинні додати його до свого проекту - у програмі будь-якого розміру, яка відмовна, і це також забирає величезну користь контролю вихідного коду в тому, що ви насправді не можна повернути до повного попереднього стану проекту лише через git.

Файл .pbxproj - це просто список властивостей (схожий на XML). З досвіду, саме про ТІЛЬКИ конфлікт злиття, який ви коли-небудь отримували, це якщо двоє людей додали файли одночасно. Рішенням у 99% випадків конфлікту злиття є збереження обох сторін злиття, що для git принаймні просто включає видалення будь-яких рядків >>>>, <<<< та ====. Насправді це так часто, що я створив простий скрипт оболонки, щоб виправити .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

Тоді git завжди буде приймати обидві сторони об'єднання для файлів .pbxproject, маючи той самий ефект, що і сценарій, який я надав, лише без зайвих робіт.

Нарешті, ось мій повний .gitignore-файл, який показує, що я маю, він налаштований ігнорувати, оскільки є кілька речей, які ви не хочете - у моєму випадку насправді лише emacs залишки та весь каталог збірки:

# xcode noise
build/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile

3
Чи взагалі використовується файл .gitattributes для вашого проекту xcode? І дякую вам за розуміння. Я думаю, буде набагато простіше спробувати об’єднати файли pbxproj у майбутньому.
rickharrison

1
На сьогоднішній день у нас не було, хоча деякі аспекти цього виглядають цікавими - але люди, з якими я працював, не були просунутими користувачами git, і тому адвокація розширених функцій не є сильною.
Кендалл Гельмстеттер Гелнер

1
"Файл .pbxproj просто JSON (схожий на XML)." Насправді це список властивостей у форматі OpenStep. Ті ж основні ідеї, що й JSON, але синтаксис відрізняється в декількох місцях.
Пітер Хосі

1
Інша справа , щоб спробувати - набір злиття = союз: stackoverflow.com/questions/2729109 / ...
Kendall Helmstetter Gelner

1
Я згоден з @KendallHelmstetterGelner замість запуску скрипта, який видаляє ці спеціальні лінії, ви можете оновити .gitattribute з unionперемикачем: *.pbxproj text/plain -crlf -diff -merge union.
Бесі

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


Злиття = об'єднання добре, але прийнятною відповіддю повинен бути інструмент mergepbx.
Альпер

8

Чесно кажучи, наявні відповіді вводять в оману.

Якщо ви ніколи не видаляєте і не перейменовуєте файли, то merge=unionкорисна ідея з використанням стратегії, яка просто поєднує відмінності в різних комісіях.

Однак у реальному світі нам іноді потрібно видаляти чи перейменовувати файли. Об’єднання відмінностей без будь-яких модифікацій створювало б багато проблем у цих ситуаціях, і ці проблеми зазвичай призводять до проблеми "Цілісність робочої області - не вдалося завантажити проект", завдяки чому ви навіть не можете запустити проект.

Найкраще рішення, яке я отримав поки що:

1) Добре спроектуйте проект і додайте всі необхідні файли на початку, так що вам рідко потрібно буде змінити project.pbxproj.

2) Зробіть свої особливості крихітними. Не роби занадто багато справ у гілці.

3) З будь-якої причини, якщо вам потрібно змінити структуру файлів і отримати конфлікти project.pbxproj, скористайтеся улюбленим текстовим редактором, щоб вирішити їх вручну. Коли ви робите свої завдання крихітними, конфлікти може бути легко вирішити.


3

Коротка відповідь полягає в тому, що навіть якщо ви не включите цей рядок .gitattributes, ви, можливо, не зможете легко об'єднати дві модифіковані версії .pbxproj. Для git краще розглядати це як двійковий файл.

Детальніше див. Тут: Git та pbxproj

Оновлення: Хоча книга з git все ще погоджується з цією відповіддю, я більше не займаюся. Я керую версіями, .pbxprojяк і будь-який інший небінарний вихідний файл.


здається, ви могли б встановити фільтр фіксації для надсилання файлу через simplejsonабо якийсь такий пристрій на шляху до індексу. Однак це все одно не гарантовано.
інтуїтоване

1
Це не файл, форматований JSON. Схоже, але в деталях багато.
eonil

У Git книзі написано JSON, але, схоже, це неправильно. 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розуміє семантику файлу вашого проекту, і тому правильно вирішить конфлікт.

Однак проект все ще альфа, не сподівайтеся, що він зрозуміє кожен файл проекту, який знаходиться там.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.