2010-01-05 4 views
47

В нашей команде 2 члена. Мы используем SCM Xcode (используйте SVN) для обработки файлов исходного кода. Мы все добавляем файлы в наш проект Xcode. Он поручил svn серверу. Когда я обновляю, Xcode находит конфликты в файле project.pbxproj. Затем я выбираю quit Xcode и вручную слияние конфликтов. Затем я начинаю редактировать проект project.pbxproj, объединяя наши изменения. На самом деле я не знаю, как Xcode управляет файлами, я просто добавляю текст, который не был у моего файла project.pbxproj. Когда я закончил, мой проект не открывается. Я думаю, потому что файл project.pbxproj не может быть изменен вручную.Как слить конфликты (файл project.pbxproj) в Xcode использовать svn?

Итак, я хочу знать, когда вы обнаружите эту проблему, файл project.pbxproj имеет конфликты, как его решить?

Спасибо!

ответ

17

К сожалению, вы ничего не можете сделать, кроме как внести изменения вручную в один чек, а затем зарегистрировать новый «объединенный» проект.

+1

Проведя время, чтобы найти волшебное решение. Это единственный приемлемый для меня ответ. –

-20

Лучше всего сделать бы просто принять либо версию или его версию в полном объеме, не пытаясь объединить два. Кроме того, рассмотрим, является ли рассматриваемый файл тем, что должно быть в репозитории вообще; может быть более уместным позволить каждому человеку иметь свою собственную версию.

Отметить documentation о том, как разрешать конфликты.

+0

Это. Файлы .pbxproj являются довольно простыми (если многословными) файлами, и обычная техника слияния обычно работает нормально, если вы терпеливы. –

+13

'project.pbxproj' - важный файл для размещения в вашем репозитории, поскольку он сообщает Xcode, как построить проект. Не проверять его эквивалентно не проверять в 'Makefile'. –

+4

Этот ответ опасно неверен. Не просто принять тот или другой или ваш проект будет отсутствовать файлы. И да, это должно быть в репозитории, иначе все будут строить проект по-разному с различными результатами. – DougW

114

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

Обычно редактирование очень просто. Просто зайдите в файл project.pbxproj с текстовым редактором и найдите раздел слияния конфликта - обычно это маркируется что-то вроде:

>>>>>>> 
Stuff 1 
====== 
Stuff 2 
<<<<<<<< 

В 99% проекта Xcode сливаться случаев конфликта, вы просто хотите принимают обе стороны слияния (потому что два человека добавили различные файлы) - так что вы просто удалить маркеры слияния, в приведенном выше случае, будет в конечном итоге, как:

Stuff 1 
Stuff 2 

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

+1

Еще один ответ на очень похожий вопрос, аргументирующий рассмотрение файла pbxproj как двоичного файла: http://stackoverflow.com/questions/1549578/git-and-pbxproj/1549590#1549590 –

+3

Они мертвы неправильно. Почему для автоматизированной системы необходимо скомпенсировать какой-либо текстовый формат, чем сам код? Это не имеет никакого смысла. Я работаю с другими людьми в проектах XCode каждый день уже много лет, каждый раз применяя стратегию слияния выше (хотя в эти дни я просто говорю инструмент слияния, чтобы принять обе стороны любого конфликта). Этот подход работает отлично. Теперь раскадровки, там мне нужно экспериментировать больше, прежде чем я буду утверждать, что работает. –

+2

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

1

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

3

Я искал простое решение этой проблемы, когда я наткнулся на этот другой вопрос/ответ:

https://stackoverflow.com/a/14180388/307217

Я был полностью сдулся, как просто это решение, я пытался объединить в разрозненной ветви функции, которая была почти 200 ревизий за багажником, XCode и Mercurial не были счастливыми отдыхающими. Я попытался вручную слить файл pbxproj (который имел более 100 конфликтов) 8 раз, прежде чем пытаться это решение.

В принципе решение как таковое (если вы используете Mercurial, потому что это является удивительным):

  1. Попытаться ваш слияния в ртутный:

    hg update FEATURE_BRANCH 
    hg merge default 
    *mercurial gives you a ton of crap about the pbxproj file having merge conflicts* 
    
  2. Открыть Xcode

  3. С верхнюю панель инструментов, выберите Xcode-> Open Developer Tool-> FileMerge
  4. Слева откройте свой конфликтный p «Файл (один с разметкой слияния конфликта в нем)
  5. На правой стороне, откройте„roject.pbxproj project.pbxproj.orig“
  6. Выберите Файл-> Сохранить Объединить и сохранить над„project.pbxproj“ файл
  7. Затем обратно в командной строке:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj 
    *merge any other broken files* 
    hg commit -m "manually merged with trunk" 
    
  8. едят торт Потому что вы сделали
+0

Это приводит к сбою Xcode 5 FileMerge в моем случае. –

+0

booo, хорошо работает в 4.6.3 .... :) –

+1

Выключает Xcode 5 FileMerge падает почти на все. Отличная работа по доставке его Apple ... –

0

Я создал инструмент "xUnique" https://github.com/truebit/xUnique, это работает!

+2

Обратите внимание, что [ссылки только ответы] (http : //meta.stackoverflow.com/tags/link-only-answers/info) обескуражены, SO-ответы должны быть конечной точкой поиска решения (против еще одной остановки ссылок, которые, как правило, становятся устаревшими со временем). Пожалуйста, подумайте о добавлении отдельного резюме здесь, сохранив ссылку в качестве ссылки. – kleopatra

2

Это решение только для мерзавца, но вы можете добавить .gitattributes файл в проект, то в этом файле добавьте следующую строку:

*.pbxproj merge=union

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

1

Как указывалось выше наиболее распространенный способ обращения конфликтов является

  1. принять «все»
  2. повторно импортировать файлы в проект

Я написал bash-script, который заботится о (1) выше.

Обратите внимание, что это разрешит только наиболее распространенный случай конфликтов слияния!

#!/bin/bash 
# 
# 
# 
if [ $# -eq 0 ] 
then 
    echo "File must be provided as argument, darnit!" 
    exit 1 
fi 

if [ $# -eq 2 ] 
then 
    echo "only ONE File must be provided as argument, darnit!" 
    exit 1 
fi 


echo "Will remove lines from file:" $1 
grep -v "<<<<<" $1 | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp $1 
echo "Done removing lines from file:" $1