我们团队中有两名成员。我们使用Xcode的SCM(使用SVN)来管理我们的源代码文件
我们都将文件添加到Xcode项目中。他已经致力于SVN服务器。当我更新时,Xcode发现project.pbxproj
文件中存在冲突。然后我选择退出Xcode
并手动合并冲突。然后我开始编辑我的project.pbxproj
,合并我们的更改。实际上我不知道Xcode如何管理文件,我只是添加了一些我的project.pbxproj
文件没有的文本。当我完成时,我的项目无法打开。我想这是因为project.pbxproj
文件无法通过手动编辑。
所以,我想知道,当你发现这个问题时,project.pbxproj文件有冲突,怎么解决呢?
谢谢!
答案 0 :(得分:130)
我使用git但我们看到同样的问题 - 如果两个人添加文件就会发生合并冲突。
通常编辑很简单。只需使用文本编辑器进入project.pbxproj文件,然后查找合并冲突部分 - 通常用以下内容标记:
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
在99%的Xcode项目合并冲突情况下,你只想接受合并的两面(因为两个人添加了不同的文件) - 所以你只需删除合并标记,在上面的情况下最终会像:
Stuff 1
Stuff 2
就像我说的,这在大多数情况下都很有用。如果Xcode在您完成后不会读取项目文件,只需获取最新的未合并版本并再次手动添加文件。
答案 1 :(得分:24)
不幸的是,除了在一次结账时手动进行更改,然后签入新的“合并”项目之外,您无能为力。
答案 2 :(得分:5)
此解决方案仅适用于git,但您可以将.gitattributes
文件添加到项目中,然后在该文件中添加以下行:
*.pbxproj merge=union
这将告诉git保持合并的两面,这将是你想要的绝大部分时间。
答案 3 :(得分:3)
当我遇到其他问题/答案时,我正在寻找一个直接解决这个问题的方法:
https://stackoverflow.com/a/14180388/307217
我对这个解决方案的简单程度感到非常震惊,我试图在一个不同的功能分支中合并,这个分支几乎是后备箱的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"
答案 4 :(得分:2)
如上所述,处理冲突的最常见方式是
我写了一个负责上述(1)的 bash-script 。
请注意,这只会解决最常见的合并冲突问题!
#!/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
答案 5 :(得分:2)
要手动解决合并冲突,请检查每个冲突项目的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
文件中来基本上忽略合并冲突,因为除非有复杂的方法,否则始终应手动检查冲突的合并脚本为您完成任务。
答案 6 :(得分:1)
有时可以在不同的分支中重新创建一个或几个文件(例如ManagedObjects),因此当您合并时,一个块中的一个文件可能有两个声明。在这种情况下,您应该删除其中一个声明。
答案 7 :(得分:1)
我碰巧遇到了这个棘手的问题。
您可以尝试此操作,而不是手动处理这些冲突。
假设您在要素分支上。
project.pbxproj
中的内容project.pbxproj
中的当前内容)运行
react-native link
答案 8 :(得分:0)
我创建了一个工具&#34; xUnique&#34; https://github.com/truebit/xUnique,它有效!
答案 9 :(得分:0)
到目前为止,我用于pbx文件的最佳可视合并工具是Visual Studio Code的合并工具。我在Code应用程序中打开pbx文件并修复冲突,然后再次打开XCode。
答案 10 :(得分:0)
您可以在VSCODE上打开它,并在那里修复冲突的合并。在IDE上寻找一些彩色的注释,或在文本搜索中寻找<<< >>>。
答案 11 :(得分:0)
我知道90%的冲突都是明确的,您可以接受冲突中的两种更改,因此您不必担心如果有耐心就能解决问题 我发现使用xUnique之类的工具可以为您带来很多帮助的方式
答案 12 :(得分:-25)
最好的办法可能是完全接受 你的版本或他的版本,而不是试图将两者结合起来。另外,请考虑相关文件是否应该存储在存储库中;让每个人拥有自己的版本可能更合适。
查看有关如何解决冲突的documentation。