是否可以安全删除XCode的project.pbxproj文件中的重复文件引用?

时间:2012-07-17 21:13:54

标签: ios xcode pbxproj

我公司的iPhone / ipad产品已经迁移了几代iOS和Xcode(现在为5.1和4.3),并且有很多目标。也许是因为这些因素,PBXBuildFile部分中的每个源文件都有许多相同的行,例如:

14EE4CD315A5E69000DCA763 /* movie@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; };
14EE4CD415A5E69000DCA763 /* movie@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; };
14EE4CD515A5E69000DCA763 /* movie@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; };
14EE4CD615A5E69000DCA763 /* movie@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; };
14EE4CD715A5E69000DCA763 /* movie@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; };

请注意,给定源文件的行是绝对的(我错了,它们不完全......)相同,并且重复行的数量从无到六或更多不等。由于这种重复,project.pbxproj的PBXBuildFile部分差不多5000行,但我们实际上只有大约1200个唯一文件。

在我编写一个脚本来删除所有这些重复行,并要求测试所有构建和目标的完全回归之前,我想确定Xcode不需要这些重复的行,这是出于某种神秘的原因。 / p>

我相当确定这不是由于版本控制不足造成的;重复行只出现在PBXBuildFile部分,虽然我不喜欢P4,但我们在合并project.pbxproj文件更改方面没有什么问题,尽管近20,000行,但它有点笨拙。我认为Xcode的一些版本可以做到这一点,也许是在添加新目标时,但我没有发现其他任何人抱怨这个问题。

次要问题: 这怎么发生的?有没有人发现这些重复的行?

4 个答案:

答案 0 :(得分:5)

如您所见,文件引用是重复的,但每个目标内的文件ID有一点差别14EE4CD * 3 * 15A5E69000DCA763,第8位数字相当不同。

答案 1 :(得分:5)

为后代发帖,以防其他人遇到这种情况。

这种情况一直发生在开发人员在不同的分支机构工作时,例如将文件移动到不同的文件夹,在另一个开发人员在另一个分支上进行更改的另一个组在同一子文件夹中添加新组,然后需要将他们的项目更改合并回公共基本分支。合并Xcode项目文件是它自己特殊的地狱,没有什么好方法可以确定哪些引用是你要保留的;正如@Maistor Kokir指出的那样,每个引用的id都是唯一的,选择正确的id是至关重要的,因为组按ID引用文件,更重要的是,构建规则和目标也是如此参考id。

我发现可靠地修复此问题的唯一方法是删除对相关文件的所有引用(在构建目标中"构建阶段" |"编译来源"),然后重新加入。

而且,要真正在源头修复它,我建议开发人员在公共分支上进行任何项目更改(例如git" master"分支) ,然后将该更改合并到他们的开发分支。项目添加通常不需要相同的处理;只会在理由中进行更改"其中包括(但仅限于)将文件移动到其他组,甚至移动到同一组内的其他位置,重命名或删除组,删除或修改子模块引用等。经验将是您真正的指导。

答案 2 :(得分:0)

我最后写了并运行脚本剥离了许多重复的文件引用。这样做似乎完全无害,我的本地构建都继续正常工作。 我从来没有检查过这些修正案,因为我当时更换了雇主,在离开之前扔掉一个有可能破坏十几个团队建造的炸弹似乎很粗鲁。

答案 3 :(得分:0)

通常Xcode会为多个目标中引用的文件生成唯一引用(ID' s)。我想你有两个以上的构建目标和LoginViewController引用,最终得到不同的fileRef ID' s。虽然它看起来很相似,但假设它可能是无害的,可能会导致崩溃。

您可以从http://www.monobjc.net/xcode-project-file-format.html了解有关pbxproj文件的更多信息。