Можно ли безопасно удалить дубликаты ссылок в файлах project.pbxproj XCode?
Продукт iPhone/ipad моей компании мигрировал через несколько поколений iOS и Xcode (в настоящее время версии 5.1 и 4.3) и имеет много целей. Возможно, из-за этих факторов в разделе PBXBuildFile есть много одинаковых строк для каждого исходного файла, например:
14EE4CD315A5E69000DCA763 / * movie@2x.png в разделе Ресурсы */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; }; 14EE4CD415A5E69000DCA763 /* movie@2x.png в разделе Ресурсы */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; }; 14EE4CD515A5E69000DCA763 /* movie@2x.png в разделе Ресурсы */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; }; 14EE4CD615A5E69000DCA763 /* movie@2x.png в разделе Ресурсы */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* movie@2x.png */; }; 14EE4CD715A5E69000DCA763 /* movie@2x.png в разделе Ресурсы * / = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 / * movie@2x.png * /; };
Обратите внимание, что строки для данного исходного файла абсолютно абсолютно одинаковы (я был не прав, они не совсем...), а количество повторяющихся строк варьируется от нуля до полудюжины и более. Из-за этого дублирования секция PBXBuildFile проекта.pbxproj имеет длину почти 5000 строк, хотя в действительности у нас всего около 1200 уникальных файлов.
Прежде чем я соберу скрипт, чтобы убрать все эти дубликаты, и попросить проверить полную регрессию для всех сборок и целей, я хотел бы убедиться, что Xcode не нуждается в этих дублирующих строках по какой-то непонятной причине.
Я совершенно уверен, что это не было вызвано измененным контролем версий; повторяющиеся строки появляются только в разделе PBXBuildFile, и, хотя мне не нравится P4, у нас есть небольшие проблемы при объединении изменений файла project.pbxproj, хотя при почти 20000 строках это немного громоздко. Я думаю, что некоторые версии Xcode сделали это, возможно, при добавлении новых целей, но я не нашел никого, кто бы жаловался на эту проблему.
Вторичные вопросы: как это произошло? Кто-нибудь еще нашел такие дубликаты строк?
4 ответа
Отправка для потомков, на случай, если другие столкнутся с этим тоже.
Это происходит все время, когда разработчики работают над отдельными ветками и, например, перемещают файлы в разные папки, добавляют новые группы в той же подпапке, что и другая группа, в которую другой разработчик вносит изменения, в отдельную ветку и т. Д., А затем необходимо объединить изменения своего проекта обратно в общую базовую ветку. Слияние файлов проекта XCode - это особый ад, и нет хорошего способа определить, какую из этих ссылок вы хотите сохранить; как Maistor Kokir, идентификатор будет уникальным для каждой ссылки, и очень важно выбрать правильный, так как группы ссылаются на файлы по идентификатору, и, что более важно, правила сборки и цели также ссылаются на идентификатор.
Единственный способ, который я нашел для надежного исправления, - это удалить все ссылки на рассматриваемый файл (в "Фазы сборки" | "Компилировать источники"), а затем снова добавить его.
И, чтобы по-настоящему исправить это в источнике, я рекомендовал разработчикам вносить любые изменения проекта в общую ветку (например, ветку git "master"), а затем объединять эти изменения с их веткой разработки. Проектные дополнения обычно не требуют такого же подхода; изменяются только "в пределах разумного", что включает в себя (но не ограничивается) перемещение файла в другую группу или даже в другое место в той же группе, переименование или удаление группы, удаление или изменение ссылок на подмодули и т. д. Опыт будет вашим настоящим гидом.
Как вы видите, ссылка на файл дублируется, но идентификатор файла внутри каждой цели имеет одно небольшое отличие 14EE4CD *3* 15A5E69000DCA763, восьмая цифра довольно различна.
Обычно XCode генерирует уникальные ссылки (идентификаторы) для файлов, на которые ссылаются несколько целей. Я предполагаю, что у вас есть более чем одна цель сборки и LoginViewController, на который ссылаются обе, которые заканчиваются различными идентификаторами fileRef. Хотя это выглядит идентично, но удаление их при условии, что оно может быть безвредным, может привести к сбоям.
Вы можете прочитать больше о файле pbxproj на http://www.monobjc.net/xcode-project-file-format.html.
Наконец-то я написал и запустил скрипт, удалив множество повторяющихся ссылок на файлы. Это казалось совершенно безвредным, все мои локальные сборки продолжали работать правильно. Я никогда не проверял эти исправления, так как менял работодателей примерно в то время, и казалось грубым бросать бомбу, которая могла сломать сборки для дюжины команд непосредственно перед уходом.