He trabajado en aplicaciones de iPhone a tiempo completo desde el lanzamiento del SDK, la mayor parte de ese tiempo lo he pasado trabajando en equipos con varios desarrolladores.
La verdad es que es mucho más dañino no permitir la fusión de ese archivo .pbxproj de lo que es útil. Como dices, cuando agregas un archivo a menos que otras personas obtengan ese archivo, también tienen que agregarlo a su proyecto, en una aplicación de cualquier tamaño, eso apesta y también quita un gran beneficio del control de código fuente en el que realmente no puede volver a un estado anterior del proyecto completo solo a través de git.
El archivo .pbxproj es simplemente una lista de propiedades (similar a XML). Por experiencia, casi el único conflicto de fusión que alguna vez obtuviste es si dos personas han agregado archivos al mismo tiempo. La solución en el 99% de los casos de conflicto de fusión es mantener ambos lados de la combinación, que para git al menos simplemente implica eliminar cualquiera >>>>, < < < <, y ==== líneas. De hecho, esto es tan común que he creado un script sencillo de solucionar un archivo .pbxproj en un estado de combinación de git, corro esto desde dentro del directorio del proyecto (a nivel de clases):
#!/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
peor caso si falla (le pide a XCode que cargue el proyecto y no se carga), simplemente borre el archivo .pbxproj, revise el maestro de git y vuelva a agregar sus archivos. Pero nunca me ha sucedido eso en muchos meses de uso con este script, nuevamente trabajando a tiempo completo en aplicaciones de iPhone con muchos otros desarrolladores.
Otra opción (señalado en los comentarios a continuación) que se puede tratar de usar en lugar de la escritura, es añadir esta línea a un archivo .gitattributes:
*.pbxproj text -crlf -diff -merge=union
Entonces Git siempre tome ambos lados de una combinación para los archivos .pbxproject, que tiene el mismo efecto que el script que proporcioné solo sin ningún trabajo adicional.
Por último, aquí está mi completo.gitignore archivo, mostrando lo que sí tengo configurado para ignorar, ya que hay algunas cosas que no desea - en mi caso realmente sólo emacs restos y todo el directorio de construcción:
# xcode noise
build/*
*.pbxuser
*.mode1v3
*~
# old skool
.svn
# osx noise
.DS_Store
profile
No trabajo con XCode, pero si los archivos * .pbxproj son algo así como los archivos * .csproj de Visual Studio (algo así como una lista de archivos), esta configuración me parece bastante idiota. Parece que alguien estaba cansado de fusionar conflictos cuando dos personas agregaron archivos al proyecto y pensaron que la mejor solución era arruinarlo todo ... –
El problema con XCode (no estoy seguro acerca de Visual Studio) es que los archivos .pbxproj son apenas humanos - legible, por lo que no tiene sentido resolver los conflictos a mano. – Tom
*.Los archivos pbxproj en realidad están bastante bien estructurados, solo tienes largos tramos entre el final del bloque y los segmentos de inicio. Lo bueno es que el archivo tiene saltos de línea muy bien colocados por lo que es difícil estropearlo solo modificando líneas y automerge generalmente funciona muy bien. También significa que los bloques de fusión generalmente son fáciles de entender: puede ver un lado con algunos conjuntos de archivos agregados, el otro con diferentes conjuntos de archivos agregados. –