There are two members in our team. We use Xcode's SCM (use SVN) to manger our source code files.
We all add files to our Xcode project. He has committed to SVN server. When I update, Xcode find there has conflicts in project.pbxproj
file. Then I select quit Xcode
and manually merge the conflicts. Then I start to edit my project.pbxproj
, merge our changes. Actually I don't know how Xcode manage files, I just add some text that my project.pbxproj
file did't have. When I finish, my project can't open. I guess that because the project.pbxproj
file can't be edit by manual.
So, I want to know, when you find this problem, the project.pbxproj file have conflicts, how to solve it?
Thank you!
I use git but we see the same issue - if two people add files there's a merge conflict.
Usually the editing is very easy though. Simply go into the project.pbxproj file with a text editor, and look for the merge conflict section - usually this is marked by something like :
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
In 99% of Xcode project merge conflict cases, you simply want to accept both sides of the merge (because two people added different files) - so you would simply delete the merge markers, in the above case that would end up like:
Stuff 1
Stuff 2
Like I said, this works great in MOST cases. If Xcode will not read the project file when you are done, just take the most recent un-merged version and manually add your files again.
Unfortunately, there's not much you can do except to make the changes manually in one check out and then check-in the newly "merged" project.
This solution is only for git, but you can add a .gitattributes
file to your project then within that file add the following line:
*.pbxproj merge=union
This will tell git to keep both sides of the merge which will be what you want the vast majority of the time.
To manually solve the merge conflicts, check the UUID
of each conflicting item.
Example:
<<<<<<< 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
Check each UUID:
ExistingFile.swift
NewFileA.swift
and NewFileB.swift
project.pbxproj
file, I would assume it is an artefact and safe to delete it.The result would be:
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 */; };
Note: I don't recommend adding *.pbxproj merge=union
to the .gitattribues
file to basically ignore merge conflicts because a conflicting merge should alway be checked manually unless there is a sophisticated script doing that for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With