Как правильно использовать 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 понимает семантику вашего файла проекта и, следовательно, разрешит конфликт правильно.

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

Другие вопросы по тегам