Как правильно использовать Git с Xcode? - PullRequest
89 голосов
/ 11 апреля 2010

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

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

Ответы [ 5 ]

131 голосов
/ 11 апреля 2010

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

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

Файл .pbxproj - это просто список свойств (аналог XML). Исходя из опыта, примерно ТОЛЬКО конфликт слияния, который вы когда-либо получали, - это если два человека добавили файлы одновременно. Решение в 99% случаев конфликта слияния состоит в том, чтобы сохранить обе стороны слияния, что, по крайней мере, для git предполагает удаление любых строк >>>>, <<<< и ====. На самом деле это так часто, что я создал простой сценарий оболочки для исправления файла .pbxproj в состоянии слияния из git, я запускаю его из каталога проекта (на уровне классов): </p>

#!/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
9 голосов
/ 22 июля 2013

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

Добавить и зафиксировать файл .gitattributes с этим:

*.pbxproj binary merge=union

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

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

6 голосов
/ 27 августа 2014

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

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

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

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

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

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

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

3 голосов
/ 11 апреля 2010

Короткий ответ: даже если вы не включите эту строку в .gitattributes, вы не сможете легко объединить две измененные версии .pbxproj. Git лучше рассматривать как двоичный файл.

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

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

2 голосов
/ 19 января 2014

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...