Как правильно использовать Git с Xcode?
Я был разработчиком iphone некоторое время, и недавно я включил git в свой рабочий процесс. Я использовал настройки git, найденные на http://shanesbrain.net/2008/7/9/using-xcode-with-git для моего рабочего процесса.
Эти настройки говорят git исключить *.pbxproj из слияний? Есть ли реальная причина для этого? Например, когда я добавляю файл в проект и нажимаю на источник, мои коллеги-разработчики не будут добавлять этот файл в свой проект xcode при извлечении. Тогда, если один из них создаст релиз, этот файл может быть не включен. Разве я не должен позволить git обрабатывать слияния для файла проекта? Почему или почему этот файл не должен быть объединен и как правильно обрабатывать ситуацию, когда файлы добавляются в проект?
5 ответов
С момента запуска SDK я работал над приложениями для iPhone большую часть времени, большую часть времени проводил в командах с несколькими разработчиками.
Правда в том, что запретить слияние этого файла.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
Честно говоря, существующие ответы вводят в заблуждение.
Если вы никогда не удаляете и не переименовываете файлы, используйте merge=union
Хорошей идеей является стратегия, которая просто объединяет различия в разных коммитах напрямую.
Однако в реальном мире нам иногда нужно удалять или переименовывать файлы. Объединение различий без каких-либо изменений может создать много проблем в этих ситуациях, и эти проблемы обычно приводят к проблеме "Целостность рабочего пространства - проект не может быть загружен", из-за которой вы даже не сможете запустить проект.
Лучшее решение, которое я получил до сих пор:
1) Хорошо спроектируйте проект и добавьте все необходимые файлы в начале, так что вам редко придется менять project.pbxproj
,
2) Сделайте ваши функции крошечными. Не делай слишком много вещей в ветке.
3) По любой причине, если вам нужно изменить структуру файла и получить конфликты в project.pbxproj
, используйте ваш любимый текстовый редактор, чтобы решить их вручную. Поскольку вы делаете свои задачи крошечными, конфликты могут быть легко разрешены.
Это работает для меня в Xcode 4.6 и Git 1.7.5.
Добавьте и зафиксируйте файл.gitattributes с этим:
*.pbxproj binary merge=union
Я проверил это с другим членом команды и отлично работает.
Взято из: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap
Короткий ответ: даже если вы не включите эту строку в .gitattributes
Возможно, вы не сможете легко объединить две измененные версии.pbxproj. Git лучше рассматривать как двоичный файл.
Подробности смотрите здесь: Git и pbxproj
Обновление: Даже если git book все еще соглашается с этим ответом, я больше не делаю. Я управляю версией своего .pbxproj
как и любой другой недвоичный исходный файл.
Я создал скрипт Python, который может обрабатывать конфликты слияния в файлах проекта XCode.
Если вы хотите попробовать это, вы можете проверить это здесь: https://github.com/simonwagner/mergepbx
Вам нужно будет установить его как драйвер слияния, чтобы он вызывался автоматически при возникновении конфликта слияния в файле проекта (файл README.md сообщит вам, как это сделать).
Это должно работать намного лучше, чем при использовании merge=union
как mergepbx
понимает семантику вашего файла проекта и, следовательно, разрешит конфликт правильно.
Однако проект все еще альфа, не ожидайте, что он поймет каждый файл проекта, который там находится.