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

Tar*_*ryn 7 xcode ios 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不需要这些重复的行是出于某种神秘的原因.

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

次要问题:这是怎么发生的?还有其他人发现这些重复的行吗?

小智 6

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

  • 是的,看起来如果你有多个构建目标,这个部分将为每个目标唯一地引用它们一次.有点理智. (2认同)

ful*_*els 6

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

当开发人员在单独的分支上工作时(例如将文件移动到不同的文件夹,与另一个开发人员在单独的分支上进行更改的另一个组相同的子文件夹中添加新的组等),然后需要将他们的项目更改合并回一个公共基础分支。合并Xcode项目文件是它自己的一种特殊方式,没有很好的方法来确定这些引用中的哪个是您要保留的。正如@Maistor Kokir指出的那样,每个引用的ID都是唯一的,选择正确的ID至关重要,因为组是按ID引用文件的,更重要的是,构建规则和目标也都引用了ID。

我发现可靠解决此问题的唯一方法是删除对相关文件的所有引用(在构建目标的“构建阶段” |“编译源”中),然后再次将其重新添加。

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