Why Xcode is hard to back up
Git covers your source. It does not cover the rest of what makes a Mac a working Xcode environment. ~/Library/Developer/Xcode/DerivedData grows into tens of gigabytes of build intermediates that regenerate on the next build. Simulator runtimes and their on-disk state can be dozens of gigabytes per installed iOS version. Provisioning profiles at ~/Library/MobileDevice/Provisioning Profiles are the quiet reason a clean-room Mac cannot build-and-sign a release for three hours. Swift Package Manager’s resolved package cache, custom Instruments templates, user-defined build settings, and code-signing identities in the login keychain are all easy to forget. Copy everything and the backup is enormous and slow. Copy only your source and the restored Mac is useless until a day of reinstalling tooling.
How macup handles it
macup excludes DerivedData, Simulator device data, Swift package build caches, and Module Cache by default — they regenerate, they are huge, and they churn on every compile. What it includes is the tooling state that matters: provisioning profiles, custom Instruments templates, Xcode user preferences, and your local Git repositories. If you keep clones outside ~/Documents, add their parent directory.
Swift Package dependency caches at ~/Library/Caches/org.swift.swiftpm are excluded because Package.resolved plus a fresh resolve rebuilds them. But the .swiftpm directory inside each project, which carries workspace state and user-scheme data, is captured along with the repo.
Continuous backup watches while you work. Because chunked deduplication operates on file contents, switching branches and rebuilding does not balloon the set. Large build-artifact directories stay excluded across branches because the exclude rules are glob-based, not path-snapshotted.
Recommended policy
A backup set configured like this covers the important things and skips the regeneratable ones:
name: Xcode work
include:
- ~/Documents/Developer
- ~/GitHub
- ~/Library/MobileDevice/Provisioning Profiles
- ~/Library/Developer/Xcode/UserData
- ~/Library/Developer/Xcode/Templates
- ~/Library/Application Support/Instruments
exclude:
- "**/DerivedData/**"
- "**/.build/**"
- "**/build/**"
- "**/*.xcodeproj/xcuserdata/**"
- "**/*.xcworkspace/xcuserdata/**"
- "**/ModuleCache.noindex/**"
- "**/CoreSimulator/Devices/**"
- "**/Caches/org.swift.swiftpm/**"
schedule:
mode: continuous
debounceSeconds: 45
quietHours: 02:00-06:00
destination: s3-compatible
retention:
daily: 30
weekly: 26
monthly: 24Tune further in the macup dashboard per destination.
What you get back
You boot a fresh Mac, install Xcode, run one restore, and the provisioning profiles, Instruments templates, and repositories land where Xcode expects them. The first build of your flagship project takes a while because DerivedData has to rebuild. Then it is a normal development Mac — not a weekend project.