Как слить конфликты (файл project.pbxproj) в Xcode использовать svn?

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

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

Спасибо!

Ответ 1

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

Ответ 2

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

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

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

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

Stuff 1
Stuff 2

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

Ответ 3

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

*.pbxproj merge=union

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

Ответ 4

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

fooobar.com/questions/67384/...

Я был полностью потрясен тем, насколько просто это решение, я пытался слиться в разрозненную ветку функций, которая была почти 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
  • Слева откройте конфликтный файл project.pbxproj(тот, у которого есть разметка слияния)
  • Справа откройте свой проект project.pbxproj.orig
  • Выберите File- > Save Merge и сохраните файл 'project.pbxproj'
  • Затем вернитесь в командной строке:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  • Ешьте пирог, потому что вы сделали.

Ответ 5

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

  • принять "все"
  • повторно импортировать файлы в проект

Я написал 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

Ответ 6

Чтобы вручную разрешить конфликты слияния, проверьте 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, я бы предположил, что это артефакт и его можно безопасно удалить.

Результат будет:

    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 чтобы в основном игнорировать конфликты слияния, потому что конфликтующее слияние должно всегда проверяться вручную, если для этого не существует сложный скрипт.

Ответ 7

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

Ответ 8

Я случайно столкнулся с этой сложной проблемой.

Вместо того, чтобы вручную справляться с этими конфликтами, вы можете попробовать это.
Предположим, вы находитесь на ветке функций.

  1. Git Checkout Master.
  2. Скопируйте содержимое в project.pbxproj
  3. Git checkout в вашу ветку функций и вставьте его. (Переопределите текущий контент в project.pbxproj)
  4. Бежать

    react-native link
    

Ответ 10

На данный момент лучший инструмент визуального слияния, который я использовал для файлов pbx, - это инструмент слияния кода Visual Studio. Я открываю файл pbx в приложении "Код" и исправляю конфликты, затем снова открываю XCode.

Ответ 12

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

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