Как объединить конфликты (файл проекта.pbxproj) в Xcode использовать svn?



в нашей команде есть два члена. Мы используем SCM Xcode (use SVN) для хранения наших файлов исходного кода.

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



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



спасибо!

837   9  

9 ответов:

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

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

обычно редактирование очень легко. Просто войдите в проект.pbxproj файл с текстовым редактором, и искать раздел слияния конфликтов-обычно это помечается чем-то вроде :
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<

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

Stuff 1
Stuff 2

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

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

*.pbxproj merge=union

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

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

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

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

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

  1. попытка слияния в mercurial:

    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. слева откройте свой конфликтный ' проект.файл pbxproj' (тот, в котором есть разметка конфликта слияния это)
  5. С правой стороны, откройте свой 'проект.pbxproj.ориг
  6. выберите Файл->Сохранить объединить и сэкономить на проекте.pbxproj ' file
  7. потом снова в командной строке:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. Ешьте Торт, Потому Что Вы Сделали

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

  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:" 
grep -v "<<<<<"   | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp 
echo "Done removing lines from file:" 

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

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

пример:

<<<<<<< HEAD
    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
=======
    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };
>>>>>>> branch_to_merge

проверьте каждый UUID:

  • если это происходит в обеих версиях, удалите его в одной версии:ExistingFile.swift
  • если это не происходит на ветке сравнения, сохраните его:NewFileA.swift и NewFileB.swift
  • если он нигде не упоминается в файле, т. е. вы можете найти только одно вхождение во всем project.pbxproj файл, I предположим, что это артефакт и безопасно его удалить.

результат будет такой:

    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
    4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };

Примечание: я не рекомендую добавлять *.pbxproj merge=union до .gitattribues файл в основном игнорирует конфликты слияния, потому что конфликтующее слияние всегда должно проверяться вручную, если только для вас не существует сложного сценария.

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

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

Проверьте документация о том, как разрешать конфликты.

Comments

    Ничего не найдено.