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

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

Те настройки говорят мерзавцу исключать *.pbxproj из слияний? Существует ли настоящая причина для того, чтобы сделать это? Например, когда я добавляю файл к проекту и нажатие к источнику, моим поддерживающим разработчикам не добавят тот файл к их проекту XCode, когда они вытянут. Затем, если один из них создает выпуск, этот файл не может быть включен. Я не должен только позволять мерзавцу обработать слияния для файла проекта? Почему или почему не этот файл должен быть в слияниях и как правильно обработать ситуацию, когда файлы добавляются к проекту?

90
задан Cœur 22 November 2018 в 03:18
поделиться

2 ответа

Я работал над приложениями для 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 file:

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

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

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

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

# old skool
.svn

# osx noise
.DS_Store
profile
132
ответ дан 24 November 2019 в 07:04
поделиться

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

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

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

3
ответ дан 24 November 2019 в 07:04
поделиться