Как объединить конфликты (файл project.pbxproj) в Xcode использовать SVN? - PullRequest
58 голосов
/ 05 января 2010

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

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

Спасибо!

Ответы [ 11 ]

130 голосов
/ 05 января 2010

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

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

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

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

Stuff 1
Stuff 2

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

24 голосов
/ 05 января 2010

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

5 голосов
/ 15 марта 2016

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

*.pbxproj merge=union

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

3 голосов
/ 28 марта 2013

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

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

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. Ешь торт, потому что ты готов
2 голосов
/ 05 сентября 2018

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

2 голосов
/ 19 апреля 2016

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

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

Я написал bash-скрипт , который заботится о (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
1 голос
/ 20 декабря 2018

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

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

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

    react-native link
    
1 голос
/ 08 июня 2012

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

0 голосов
/ 13 марта 2019

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

0 голосов
/ 26 января 2016

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

...