Как объединить конфликты (файл проекта.pbxproj) в Xcode использовать svn?
в нашей команде есть два члена. Мы используем SCM Xcode (use SVN) для хранения наших файлов исходного кода.
Мы все добавляем файлы в наш проект Xcode. Он совершил к серверу SVN. Когда я обновляю, Xcode находит там конфликты в . Затем я выбираю quit Xcode и вручную объединить конфликтов. Затем я начинаю редактировать мой project.pbxproj, объединить наши изменения. На самом деле я не знаю, как Xcode управляет файлами, я просто добавляю текст, который мой project.pbxproj файла не было. Когда я закончу, мой проект не могу открыть. Я думаю, что потому что project.pbxproj файл не может быть отредактирован вручную.
Итак, я хочу знать, когда вы найдете эту проблему, проект.в файле pbxproj есть конфликты, как их решить?
спасибо!
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, потому что это потрясающе):
попытка слияния в mercurial:
hg update FEATURE_BRANCH hg merge default *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*Открыть Xcode
- на верхней панели инструментов выберите Xcode - > Open Developer Tool - >FileMerge
- слева откройте свой конфликтный ' проект.файл pbxproj' (тот, в котором есть разметка конфликта слияния это)
- С правой стороны, откройте свой 'проект.pbxproj.ориг
- выберите Файл->Сохранить объединить и сэкономить на проекте.pbxproj ' file
потом снова в командной строке:
hg resolve -m ProjectName.xcodeproj/project.pbxproj *merge any other broken files* hg commit -m "manually merged with trunk"- Ешьте Торт, Потому Что Вы Сделали
Как указано выше наиболее распространенным способом из обработки конфликтов является
- принимать "все"
- повторно импортировать файлы в проект
Я написал 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