Iphone 如何在Xcode中使用svn合并冲突(project.pbxproj文件)?
我们队有两名队员。我们使用Xcode的SCM(使用SVN)来管理源代码文件。Iphone 如何在Xcode中使用svn合并冲突(project.pbxproj文件)?,iphone,svn,xcode,conflict,Iphone,Svn,Xcode,Conflict,我们队有两名队员。我们使用Xcode的SCM(使用SVN)来管理源代码文件。 我们都将文件添加到Xcode项目中。他已承诺支持SVN服务器。更新时,Xcode发现project.pbxproj文件中存在冲突。然后我选择quitXcode,并手动合并冲突。然后我开始编辑我的项目.pbxproj,合并我们的更改。实际上我不知道Xcode如何管理文件,我只是添加了一些我的project.pbxproj文件没有的文本。当我完成时,我的项目无法打开。我想这是因为project.pbxproj文件不能手动编
我们都将文件添加到Xcode项目中。他已承诺支持SVN服务器。更新时,Xcode发现
project.pbxproj
文件中存在冲突。然后我选择quitXcode
,并手动合并冲突。然后我开始编辑我的项目.pbxproj
,合并我们的更改。实际上我不知道Xcode如何管理文件,我只是添加了一些我的project.pbxproj
文件没有的文本。当我完成时,我的项目无法打开。我想这是因为project.pbxproj
文件不能手动编辑
所以,我想知道,当您发现这个问题时,project.pbxproj文件有冲突,如何解决它
谢谢大家! 不幸的是,除了在一次签出中手动进行更改,然后签入新的“合并”项目之外,您没有什么可以做的。最好的办法可能是只接受您的版本或他的整个版本,而不尝试将两者结合起来。此外,考虑所讨论的文件是否应该是存储库中的所有内容;让每个人都有自己的版本可能更合适
查看有关如何解决冲突的信息。我使用git,但我们看到了相同的问题-如果两个人添加文件,则存在合并冲突 但通常情况下,编辑是非常容易的。只需使用文本编辑器进入project.pbxproj文件,并查找合并冲突部分-通常这是由以下内容标记的:
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
就像我说的,这在大多数情况下都很有效。如果完成后Xcode不会读取项目文件,只需使用最新的未合并版本并再次手动添加文件。有时可以在不同的分支中重新创建一个或几个文件(例如ManagedObjects),因此在合并时,一个块中的一个文件可能有两个声明。在这种情况下,您应该删除其中一个声明。当我遇到另一个问题/答案时,我正在寻找一个简单的解决方案: 我完全被这个解决方案的简单程度吓坏了,我试图合并到一个完全不同的功能分支中,这个分支在主干后面有将近200个版本,XCode和Mercurial对此并不满意。在尝试此解决方案之前,我尝试了8次手动合并pbxproj文件(其中有100多个冲突) 基本上,解决方案是这样的(假设您使用Mercurial,因为它很棒):
hg update FEATURE_BRANCH
hg merge default
*mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
hg resolve -m ProjectName.xcodeproj/project.pbxproj
*merge any other broken files*
hg commit -m "manually merged with trunk"
我创建了一个工具“xUnique”,它很管用 此解决方案仅适用于git,但您可以将
.gittributes
文件添加到项目中,然后在该文件中添加以下行:
*.pbxproj merge=union
这将告诉git保留合并的双方,这在大多数情况下都是您想要的。如上所述,处理冲突的最常见方法是
#/bin/bash
#
#
#
如果[$#-eq 0]
然后
echo“文件必须作为参数提供,darnit!”
出口1
fi
如果[$#-eq 2]
然后
echo“darnit,只能提供一个文件作为参数!”
出口1
fi
echo“将从文件中删除行:$1
grep-v“>”|grep-v“==”>out.tmp;mv out.tmp$1
echo“已完成从文件中删除行:$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
注意:我不建议将
*.pbxproj merge=union
添加到.gittributes
文件中,以便基本上忽略合并冲突,因为冲突的合并应该始终手动检查,除非有复杂的脚本为您执行此操作。我碰巧遇到了这个棘手的问题
您可以尝试此操作,而不是手动处理这些冲突。假设您在功能分支上
project.pbxproj中的内容
project.pbxproj
中的当前内容)react-native link
到目前为止,我用于pbx文件的最好的可视化合并工具是VisualStudioCode的合并工具。我在Code app中打开pbx文件并修复冲突,然后再次打开XCode。您可以在VSCODE上打开它并修复冲突合并。在IDE上查找一些彩色注释,或在文本搜索中查找>。我知道90%的冲突是明确的,您可以接受冲突中的两个更改,因此您不必担心,如果您耐心等待,您将解决冲突
我发现使用像xUnique这样的工具会对你有很大帮助。.pbxproj文件是相当简单(如果详细的话)的文件,只要您有耐心,
project.pbxproj
是放在存储库中的一个重要文件,因为它告诉Xcode如何构建项目。不签入它相当于不签入Makefile
。这个答案错误得很危险。不要只接受其中一个,否则您的项目将丢失文件。是的,它应该在存储库中,或者
<<<<<<< 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
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 */; };
react-native link