Ответ 1
К сожалению, вы не можете сделать ничего, кроме как внести изменения вручную в один чек, а затем зарегистрировать новый "объединенный" проект.
В нашей команде два члена. Мы используем Xcode SCM (используйте SVN) для управления нашими файлами исходного кода.
Мы все добавляем файлы в наш проект XCode. Он посвятил себя серверу SVN. Когда я обновляюсь, Xcode обнаруживает конфликты в файле project.pbxproj
. Затем я выбираю выход из Xcode
и вручную объединяю конфликты. Затем я начинаю редактировать свой project.pbxproj
, объединяю наши изменения. На самом деле я не знаю, как Xcode управляет файлами, я просто добавляю текст, которого не было в моем файле project.pbxproj
. Когда я закончу, мой проект не может открыться. Я думаю, потому что файл project.pbxproj
не может быть отредактирован вручную.
Итак, я хочу знать, когда вы обнаружите эту проблему, файл project.pbxproj конфликтует, как ее решить?
Спасибо!
К сожалению, вы не можете сделать ничего, кроме как внести изменения вручную в один чек, а затем зарегистрировать новый "объединенный" проект.
Я использую git, но мы видим ту же проблему - если два человека добавляют файлы, там возникает конфликт слияния.
Обычно редактирование очень просто. Просто зайдите в файл project.pbxproj с текстовым редактором и найдите раздел конфликта слиянием - обычно это отмечено чем-то вроде:
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
В 99% случаев слияния проектов Xcode вы просто хотите принять обе стороны слияния (потому что два человека добавили разные файлы) - так что вы просто удалите маркеры слияния, в приведенном выше случае,
Stuff 1
Stuff 2
Как я уже сказал, это отлично работает в случаях МОСТ. Если Xcode не будет читать файл проекта, когда вы закончите, просто возьмите самую последнюю не объединенную версию и вручную добавьте свои файлы снова.
Это решение предназначено только для git, но вы можете добавить файл .gitattributes
в свой проект, а затем в этом файле добавить следующую строку:
*.pbxproj merge=union
Это сообщит git сохранить обе стороны слияния, которые будут тем, что вы хотите подавляющее большинство времени.
Я искал прямое решение этой проблемы, когда столкнулся с этим другим вопросом/ответом:
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
Затем вернитесь в командной строке:
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:" $1
grep -v "<<<<<" $1 | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp $1
echo "Done removing lines from file:" $1
Чтобы вручную разрешить конфликты слияния, проверьте 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
чтобы в основном игнорировать конфликты слияния, потому что конфликтующее слияние должно всегда проверяться вручную, если для этого не существует сложный скрипт.
Иногда один или несколько файлов могут быть воссозданы (например, ManagedObjects) в разных ветвях, поэтому при слиянии может быть два объявления для одного файла в одном блоке. В этом случае вы должны удалить одно из объявлений.
Я случайно столкнулся с этой сложной проблемой.
Вместо того, чтобы вручную справляться с этими конфликтами, вы можете попробовать это.
Предположим, вы находитесь на ветке функций.
project.pbxproj
project.pbxproj
)Бежать
react-native link
Я основал инструмент "xUnique" https://github.com/truebit/xUnique, он работает!
На данный момент лучший инструмент визуального слияния, который я использовал для файлов pbx, - это инструмент слияния кода Visual Studio. Я открываю файл pbx в приложении "Код" и исправляю конфликты, затем снова открываю XCode.
Вы пытались исправить их с помощью инструмента Kin? Внедрите этот инструмент несколько дней назад и работайте, кликните на мою публикацию на https://medium.com/@avendi.sianipar/alternative-way-to-solved-conflict-project-pbxproj-in-xcode-using-kin-d4684aedd2fb
Лучше всего было бы просто принять либо вашу версию, либо его версию целиком, не пытаясь совместить их. Кроме того, рассмотрим, является ли рассматриваемый файл тем, что должно быть в репозитории вообще; может быть более уместным позволить каждому человеку иметь свою собственную версию.
Просмотрите документацию о том, как разрешать конфликты.