【问题标题】:How to merge conflicts (file project.pbxproj) in Xcode use svn?如何在 Xcode 中使用 svn 合并冲突(文件 project.pbxproj)?
【发布时间】:2011-01-01 12:38:16
【问题描述】:

我们团队有两名成员。我们使用 Xcode 的 SCM(使用 SVN)来管理我们的源代码文件。
我们都将文件添加到我们的 Xcode 项目中。他已经致力于SVN服务器。当我更新时,Xcode 发现 project.pbxproj 文件中存在冲突。然后我选择退出Xcode 并手动合并冲突。然后我开始编辑我的project.pbxproj,合并我们的更改。实际上我不知道 Xcode 是如何管理文件的,我只是添加了一些我的project.pbxproj 文件没有的文本。完成后,我的项目无法打开。我猜是因为project.pbxproj 文件无法手动编辑。

所以,我想知道,当你发现这个问题时,project.pbxproj文件有冲突,如何解决?

谢谢!

【问题讨论】:

    标签: iphone svn xcode conflict


    【解决方案1】:

    我使用 git,但我们看到相同的问题 - 如果两个人添加文件,则会出现合并冲突。

    不过,通常编辑很容易。只需使用文本编辑器进入 project.pbxproj 文件,然后查找合并冲突部分 - 通常这由以下内容标记:

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

    在 99% 的 Xcode 项目合并冲突情况下,您只是想接受合并的双方(因为两个人添加了不同的文件) - 所以您只需删除合并标记,在上述情况下最终会像:

    Stuff 1
    Stuff 2
    

    就像我说的,这在大多数情况下都非常有效。如果 Xcode 在您完成后不会读取项目文件,只需获取最新的未合并版本并再次手动添加您的文件。

    【讨论】:

    • 另一个关于将 pbxproj 文件视为二进制文件的非常相似问题的答案:stackoverflow.com/questions/1549578/git-and-pbxproj/…
    • 他们大错特错。为什么自动化系统比代码本身更难合并任何文本格式?这没有道理。多年来,我每天都在与其他人一起在 XCode 项目上工作,每次都应用上面的合并策略(尽管这些天我只是告诉一个合并工具来接受任何冲突的双方)。这种方法效果很好。现在是故事板,在我声称它有效之前,我需要进行更多试验。
    • 这至少对 xcode 5 不起作用。似乎它使用了一些幻数并在将某些内容添加到项目时为所有资源重新生成它们。当发生冲突时,您应该删除两个冲突资源,手动添加它们,以便 xcode 可以再次生成这些幻数。
    • 我根本没有看到,在最近的一个项目中,当添加新资源时,只有新资源才会获得新的数字(标识符)。在 XCode 5 中为其他人共享的项目工作了数月之后,我的建议仍然保持不变。
    • 此解决方案适用于 Xcode 8 版本 8.0 (8A218a)
    【解决方案2】:

    不幸的是,除了在一次签出中手动进行更改然后签入新的“合并”项目之外,您无能为力。

    【讨论】:

    • 花了一个小时的时间找到了一个神奇的解决方案。这似乎是我唯一可以接受的答案。
    • 1 替代解决方案:通过使用“他们的”更改来解决。尝试运行它。如果有关于丢失东西的错误,那将是你丢失的东西,你知道它应该去哪里。
    【解决方案3】:

    此解决方案仅适用于 git,但您可以将 .gitattributes 文件添加到您的项目中,然后在该文件中添加以下行:

    *.pbxproj merge=union

    这将告诉 git 保留合并的双方,这将是你绝大多数时候想要的。

    【讨论】:

    • 过去这对我来说效果很好。绝对推荐。试图记住我在过去的项目中使用的设置,就是这样。谢谢提醒。
    【解决方案4】:

    要手动解决合并冲突,请检查每个冲突项的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.swiftNewFileB.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 文件以基本上忽略合并冲突,因为冲突合并应始终手动检查,除非有复杂的脚本执行此操作你。

    【讨论】:

    • 问题已被作者删除。我认为 UUID 出现两次的可能性很小。参考UUID中的Unique
    【解决方案5】:

    当我遇到这个其他问题/答案时,我正在寻找一个简单的解决方案:

    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. 选择文件->保存合并并保存在“project.pbxproj”文件上
    7. 然后回到命令行:

      hg resolve -m ProjectName.xcodeproj/project.pbxproj
      *merge any other broken files*
      hg commit -m "manually merged with trunk"
      
    8. 吃蛋糕,因为你已经完成了

    【讨论】:

    • 原来 Xcode 5 FileMerge 在几乎所有东西上都会崩溃。把它运送到苹果公司做得很好……
    • 这很糟糕,但老实说,与微软相比,苹果通常不会发布很多错误。至少他们发布的这对夫妇只影响了一小部分用户(即程序员),而且我们知道如何在谷歌上搜索其他合并工具
    【解决方案6】:

    如上所述,处理冲突的最常见的方法

    1. 接受“一切”
    2. 将文件重新导入项目中

    我写了一个 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
    

    【讨论】:

      【解决方案7】:

      有时可能会在不同的分支中重新创建一个或几个文件(例如 ManagedObjects),因此当您合并时,一个文件可能会有两个声明在一个块中。在这种情况下,您应该删除其中一个声明。

      【讨论】:

        【解决方案8】:

        到目前为止,我用于 pbx 文件的最佳可视化合并工具是 Visual Studio Code 的合并工具。我在 Code 应用程序中打开 pbx 文件并修复冲突,然后再次打开 XCode。

        【讨论】:

          【解决方案9】:

          我碰巧遇到了这个棘手的问题。

          您可以试试这个,而不是手动处理这些冲突。
          假设您在功能分支上。

          1. Git 结帐大师。
          2. 复制project.pbxproj中的内容
          3. Git checkout 到你的功能分支,然后粘贴。(覆盖project.pbxproj 中的当前内容)
          4. 运行

            react-native link
            

          【讨论】:

          • 首先,这似乎只适用于您使用 RN 时,其次,您将覆盖功能分支中的所有新文件链接。没有意义。
          【解决方案10】:

          您可以在 VSCODE 上打开它并修复那里的冲突合并。在 IDE 上查找一些彩色注释或在文本搜索中查找 >>。

          【讨论】:

            【解决方案11】:

            我创建了一个工具“xUnique”https://github.com/truebit/xUnique,它可以工作!

            【讨论】:

            • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(而不是另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
            【解决方案12】:

            我知道 90% 的冲突是明确的,并且您可以接受冲突中的两种更改,因此您不必担心,只要您有耐心,就会解决它 我发现使用 xUnique 之类的工具对您有很大帮助的方式

            【讨论】:

              【解决方案13】:

              最好的办法可能是简单地接受任何一个您的版本他的完整版本,而不是尝试将两者结合起来。另外,请考虑有问题的文件是否应该在存储库中;让每个人都有自己的版本可能更合适。

              查看documentation,了解如何解决冲突。

              【讨论】:

              • 这个。 .pbxproj 文件是相当简单(如果很冗长)的文件,并且通常的合并技术通常工作得很好,只要您有耐心。
              • project.pbxproj 是放入仓库的重要文件,因为它告诉 Xcode 如何构建项目。不签入就等于不签入Makefile
              • 这个答案非常不正确。不要只接受一个或另一个,否则您的项目将丢失文件。是的,它应该在存储库中,否则每个人都会以不同的方式构建项目并产生不同的结果。
              • 同意 DougW - 遵循这个答案将导致痛苦和困难的错误。
              • 这个答案无法改进
              猜你喜欢
              • 2015-10-11
              • 2019-05-12
              • 2016-09-21
              • 1970-01-01
              • 1970-01-01
              • 2012-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多