Git and pbxproj Git and pbxproj git git

Git and pbxproj


The pbxproj file isn't really human mergable. While it is plain ASCII text, it's a form of JSON. Essentially you want to treat it as a binary file.

Here's what the individual flags do:

-crlf: don't use crlf <=> cr conversion

-diff: do not diff the file

-merge: do not attempt to merge the file

From the Pro Git book by Scott Chacon

Some files look like text files but for all intents and purposes are to be treated as binary data. For instance, Xcode projects on the Mac contain a file that ends in .pbxproj, which is basically a JSON (plain text javascript data format) dataset written out to disk by the IDE that records your build settings and so on. Although it’s technically a text file, because it’s all ASCII, you don’t want to treat it as such because it’s really a lightweight database — you can’t merge the contents if two people changed it, and diffs generally aren’t helpful. The file is meant to be consumed by a machine. In essence, you want to treat it like a binary file.


A diff is oftentimes useful at commit time to check what has been changed. So I find it useful to keep the diffing ability but just prevent merging. So I use this in my .gitattributes file:

*.pbxproj -crlf -merge

On another note, has anybody tried using merge=union for pbxproj files? See: Should I merge .pbxproj files with git using merge=union?


I wrote a python script named xUnique to solve this merge conflicts problem.

This script do following things:

  • replace all 24 chars UUID to project-wide unique 32 chars MD5 digests, and remove any unused UUIDs(usually caused by careless merge before). This would prevent duplicate UUIDs because different machines/Xcode generate different UUIDs in this file. Xcode does recognize it and the project could be opened. During this process, remove all invalid lines in project file
  • sort the project file. I wrote a python version of sort-Xcode-project-file from Webkit team with more new features:
    • support to sort PBXFileReference and PBXBuildFile sections
    • remove duplicated files/refs
    • avoid creating new file even if no changes made, this makes less commits after using this script

More details and updates of xUnique, please refer to README