Ho lavorato a tempo pieno su applicazioni per iPhone dal lancio dell'SDK, la maggior parte del tempo trascorso lavorando in team con più sviluppatori.
La verità è che è molto più dannoso non consentire l'unione di quel file .pbxproj di quanto non sia utile. Come dici tu, quando aggiungi un file a meno che altre persone non ottengano quel file, devono anche aggiungerlo al loro progetto - in un'applicazione di qualsiasi dimensione, che fa schifo e porta via anche un enorme vantaggio del controllo del codice sorgente in quanto tu non può davvero tornare a uno stato di progetto precedente completo solo tramite git.
Il file .pbxproj è semplicemente un elenco di proprietà (simile a XML). Per esperienza, quasi l'unico conflitto di unione che hai mai ottenuto è se due persone hanno aggiunto file contemporaneamente. La soluzione nel 99% dei casi di conflitto di unione è mantenere entrambi i lati dell'unione, il che per git implica semplicemente la rimozione di qualsiasi riga >>>>, <<<< e ====. In effetti questo è così comune che ho creato un semplice script di shell per correggere un file .pbxproj in uno stato di unione da git, lo eseguo dalla directory del progetto (a livello di classi):
#!/bin/sh
projectfile=`find -d . -name 'project.pbxproj'`
projectdir=`echo *.xcodeproj`
projectfile="${projectdir}/project.pbxproj"
tempfile="${projectdir}/project.pbxproj.out"
savefile="${projectdir}/project.pbxproj.mergesave"
cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile
cp $projectfile $savefile
mv $tempfile $projectfile
Nel peggiore dei casi, se fallisce (chiedi a XCode di caricare il progetto e non si carica), elimina semplicemente il file .pbxproj, controlla il master da git e aggiungi nuovamente i tuoi file. Ma non l'ho mai visto per molti mesi di utilizzo con questo script, lavorando di nuovo a tempo pieno su applicazioni per iPhone con molti altri sviluppatori.
Un'altra opzione (indicata nei commenti di seguito) che puoi provare a utilizzare al posto dello script, è aggiungere questa riga a un file .gitattributes:
*.pbxproj text -crlf -diff -merge=union
Quindi git prenderà sempre entrambi i lati di un'unione per i file .pbxproject, avendo lo stesso effetto dello script che ho fornito solo senza alcun lavoro aggiuntivo.
Infine, ecco il mio file .gitignore completo, che mostra cosa ho impostato per ignorare in quanto ci sono alcune cose che non vuoi - nel mio caso solo i resti di emacs e l'intera directory di build:
# xcode noise
build/*
*.pbxuser
*.mode1v3
*~
# old skool
.svn
# osx noise
.DS_Store
profile