Я працював над додатками 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