Как правильно использовать Git с XCode?

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

Эти настройки показывают git исключить *.pbxproj из слияний? Есть ли настоящая причина для этого? Например, когда я добавляю файл в проект и нажимаю на начало координат, мои разработчики не будут добавлять этот файл в свой проект xcode, когда они будут тянуть. Затем, если один из них создает версию, этот файл не может быть включен. Должен ли я просто позволить git обрабатывать слияния для файла проекта? Может кто-нибудь объяснить, почему или почему этот файл не должен быть в слияниях и как правильно обрабатывать ситуацию, когда файлы добавляются в проект. Спасибо.

Ответ 1

Я работал над iPhone-приложениями на полную ставку с момента запуска SDK, большую часть времени работал над командами с несколькими разработчиками.

Истина заключается в том, что более опасно отказываться от слияния этого файла .pbxproj, чем это полезно. Как вы говорите, когда вы добавляете файл, если другие люди не получают этот файл, они также должны добавить его в свой проект - в приложении любого размера, что отстойно, а также отнимает огромную выгоду от контроля исходного кода, поскольку вы не может действительно вернуться к полному более раннему состоянию проекта только через git.

Файл .pbxproj - это просто список свойств (аналогично XML). Из опыта, как раз о единственном конфликте слияния, который вы когда-либо получали, есть, если два человека добавили файлы одновременно. Решение в 99% случаев конфликта слияния состоит в том, чтобы сохранить обе стороны слияния, что для git по крайней мере просто включает в себя удаление любых → → , < < < и ==== строк, На самом деле это настолько распространено, что я создал простую оболочку script для исправления файла .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 и повторно добавляете свои файлы. Но я никогда не делал этого в течение многих месяцев с этим script, снова работая полный рабочий день на iPhone-приложениях с несколькими другими разработчиками.

Другим вариантом (указанным в комментариях ниже), который вы можете попробовать использовать вместо script, является добавление этой строки в файл .gitattributes:

*.pbxproj text -crlf -diff -merge=union

Тогда git всегда будет брать обе стороны слияния для файлов .pbxproject, имеющих тот же эффект, что и script I, только без дополнительной работы.

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

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

# old skool
.svn

# osx noise
.DS_Store
profile

Ответ 2

Это работает для меня в Xcode 4.6 и Git 1.7.5.

Добавьте и зафиксируйте файл .gitattributes следующим образом:

*.pbxproj binary merge=union

Я тестировал это с другим членом команды и отлично работал.

Взято из: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap

Ответ 3

Честно говоря, существующие ответы вводят в заблуждение.

Если вы никогда не удаляете или не переименовываете файлы, то использование стратегии merge=union, которая просто сочетает различия в разных транзакциях напрямую, является хорошей идеей.

Однако в реальном мире нам иногда нужно иногда удалять или переименовывать файлы. Слияние различий без каких-либо модификаций в этих ситуациях создало бы много проблем, и эти проблемы обычно приводят к проблеме "Ошибка целостности рабочего пространства - Невозможно загрузить проект", что делает вас даже невозможным запустить проекта.

Лучшее решение, которое я получил до сих пор:

1) Хорошо спроектируйте проект и добавьте все необходимые файлы в начале, поэтому вам редко нужно будет изменить project.pbxproj.

2) Сделайте свои функции крошечными. Не делайте слишком много вещей в ветке.

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

Ответ 4

Короткий ответ заключается в том, что даже если вы не включите эту строку в .gitattributes, вы не сможете легко слить две измененные версии .pbxproj. Это лучше для git рассматривать его как двоичный.

Подробнее см. здесь: Git и pbxproj

Обновление: Несмотря на то, что git book по-прежнему соглашается с этим ответом, я больше не делаю. я версия управляет моим .pbxproj, как и любым другим не двоичным исходным файлом.

Ответ 5

Я создал Python script, который может обрабатывать конфликты слияния в файлах проекта XCode.

Если вы хотите попробовать, вы можете проверить его здесь: https://github.com/simonwagner/mergepbx

Вам нужно будет установить его как драйвер слияния, поэтому он автоматически вызывается при конфликте слияния в файле проекта (README.md расскажет вам, как это сделать).

Он должен работать намного лучше, чем использовать merge=union, поскольку mergepbx понимает семантику вашего файла проекта и, следовательно, правильно разрешит конфликт.

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