xUnique, is a pure Python script to regenerate project.pbxproj
, a.k.a the Xcode project file, and make it unique and same on any machine.
As you may know, the UUID
generated by Xcode in the file is not unique for the same added file( or other entries like groups,build phases,etc.) on different machines, which makes it a developer's nightmare to merge and resolve conflicts in project.pbxproj
.
xUnique convert all the 96bits UUID
(24 hex chars) to MD5 hex digest(32 hex chars)
- convert
project.pbxproj
to JSON format - Iterate all
objects
in JSON and give every UUID an absolute path, and create a new UUID using MD5 hex digest of the path- All elements in this json object is actually connected as a tree
- We give a path attribute to every node of the tree using its unique attribute; this path is the absolute path to the root node,
- Apply MD5 hex digest to the path for the node
- Replace all old UUIDs with the MD5 hex digest and also remove unused UUIDs if any
Sort project file using my modifiedsort-Xcode-project-file
, supports following new features:sortPBXFileReference
andPBXBuildFile
sectionsavoid modified changes in Git/SVN if no change made in the project file
- Sort the project file inlcuding
children
list,files
list,PBXFileReference
list andPBXBuildFile
list using pure Python- see
sort_pbxproj
method in xUnique.py if you wanna know the implementation; - It's ported from the perl script, I have to admit that Perl is really very good at text processing...
- see
- All above operations are what this script done for you;)
- Put xUnique.py file in your project repository somewhere and add it as track file via
git add path/to/xUnique.py
, so all members could use the same script - create a git hook like
{ echo '#!/bin/sh'; echo 'python2 /absolute/path/to/xUnique.py /absolute/path/to/MyProject.xcodeproj'; } > .git/hooks/pre-push
- Add permission
chmod 555 .git/hooks/pre-push
- use hook
pre-push
instead ofpre-commit
is a safe consideration: you decide to commit the newly generated project file or not
- use hook
- In all your branches, uniquify
project.pbxproj
file in either way:- make some changes and commit. Try to push, git hook would be triggered
- manually run script:
python path/to/xUnique.py path/to/MyProject.xcodeproj
and then committing changes.
- If you want to use part of xUnique functions, use below options in arguments:
-v
: print verbose output-u
: uniquify project file, that is, replace UUID to MD5 digest-s
: sort project file inlcudingchildren
list,files
list,PBXFileReference
list andPBXBuildFile
. Supports both original and uniquified project file- if neither
-u
nor-s
exists, execute both uniquify and sort
- APNS Pusher is a Xcode project which contains a subproject named "Fragaria" as git submodule. Use xUnique to convert it. You can clone my forked repo and try to open and build it in Xcode. You will find that
xUnique
does not affect the project at all.- The initial diff result could be found here.
- The diff result with my modified
sort-Xcode-project-file
withPBXBuildFile
andPBXFileReference
sort support could be found here. - Pure python sort result could be found here
- All project members must add this
pre-push
hook. Thus the project file would be consistent in the repository. - Tested supported
isa
types:PBXProject
XCConfigurationList
PBXNativeTarget
PBXTargetDependency
PBXContainerItemProxy
XCBuildConfiguration
PBXSourcesBuildPhase
PBXFrameworksBuildPhase
PBXResourcesBuildPhase
PBXFrameworksBuildPhase
PBXCopyFilesBuildPhase
PBXBuildFile
PBXReferenceProxy
PBXFileReference
PBXGroup
PBXVariantGroup
- Xiao Wang (seganw)
-
I only tested on one single project and one project with a subproject, so maybe there should be more unconsidered conditions. If you get any problem, feel free to fire a Pull Request or Issue
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.