He sido desarrollador de iPhone por un tiempo y recientemente he incluido git en mi flujo de trabajo. He utilizado la configuración de git que se encuentra en http://shanesbrain.net/2008/7/9/using-xcode-with-git para mi flujo de trabajo hasta ahora.
¿Esas configuraciones le dicen a git que excluya * .pbxproj de las fusiones? ¿Existe una razón real para hacer esto? Por ejemplo, cuando agrego un archivo al proyecto y lo envío al origen, mis compañeros desarrolladores no tendrán ese archivo agregado a su proyecto xcode cuando extraigan. Entonces, si uno de ellos crea una versión, es posible que este archivo no se incluya. ¿No debería dejar que git maneje las fusiones para el archivo del proyecto? ¿Por qué o por qué no este archivo debería estar en fusiones y cómo manejar adecuadamente la situación cuando se agregan archivos al proyecto?
fuente
Respuestas:
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 que útil. Como dice, cuando agrega 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 del código fuente en el sentido de que usted realmente no puede volver a un estado de proyecto anterior completo solo a través de git.
El archivo .pbxproj es simplemente una lista de propiedades (similar a XML). Por experiencia, el ÚNICO conflicto de fusión que ha tenido 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 fusión, que para git al menos simplemente implica eliminar cualquier línea >>>>, <<<< y ====. De hecho, esto es tan común que he creado un script de shell simple para arreglar un archivo .pbxproj en un estado de fusión desde git, lo ejecuto desde el directorio del proyecto (en el nivel de Clases):
En el peor de los casos, si falla (le pide a XCode que cargue el proyecto y no se carga), simplemente elimine el archivo .pbxproj, consulte el maestro de git y vuelva a agregar sus archivos. Pero nunca me ha pasado eso en muchos meses de uso con este script, nuevamente trabajando a tiempo completo en aplicaciones de iPhone con varios otros desarrolladores.
Otra opción (señalada en los comentarios a continuación) que puede intentar usar en lugar del script es agregar esta línea a un archivo .gitattributes:
Luego, git siempre tomará ambos lados de una combinación para los archivos .pbxproject, teniendo el mismo efecto que el script que proporcioné solo sin ningún trabajo adicional.
Por último, aquí está mi archivo .gitignore completo, que muestra lo que tengo configurado para ignorar, ya que hay algunas cosas que no desea, en mi caso, solo los restos de emacs y todo el directorio de compilación:
fuente
union
interruptor:*.pbxproj text/plain -crlf -diff -merge union
.Esto me funciona en Xcode 4.6 y Git 1.7.5.
Agregue y confirme el archivo .gitattributes con esto:
Probé esto con otro miembro del equipo y funciona muy bien.
Tomado de: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap
fuente
Francamente, las respuestas existentes son engañosas.
Si nunca elimina o cambia el nombre de los archivos, entonces
merge=union
es una buena idea usar la estrategia, que solo combina las diferencias en diferentes confirmaciones directamente.Sin embargo, en el mundo real, a veces necesitamos eliminar o cambiar el nombre de los archivos. Fusionar las diferencias sin ninguna modificación crearía muchos problemas en estas situaciones, y estos problemas generalmente conducen al problema "Integridad del espacio de trabajo: no se pudo cargar el proyecto", lo que hace que ni siquiera pueda ejecutar el proyecto.
La mejor solución que obtuve hasta ahora:
1) Diseñe bien el proyecto y agregue todos los archivos necesarios al principio, por lo que rara vez necesitará cambiar el
project.pbxproj
.2) Haz que tus rasgos sean pequeños. No hagas demasiadas cosas en una sucursal.
3) Por cualquier motivo, si necesita modificar la estructura del archivo y obtener conflictos
project.pbxproj
, use su editor de texto favorito para resolverlos manualmente. A medida que reduzca sus tareas, los conflictos pueden ser fáciles de resolver.fuente
La respuesta corta es que incluso si no incluye esa línea
.gitattributes
, es posible que no pueda fusionar fácilmente dos versiones modificadas de un .pbxproj. Es mejor que git lo trate como un binario.Consulte aquí para obtener más detalles: Git y pbxproj
Actualización: aunque el libro de git todavía está de acuerdo con esta respuesta, yo ya no lo hago. Yo controlo mi versión
.pbxproj
como cualquier otro archivo fuente no binario.fuente
simplejson
o algo más ordenado en su camino hacia el índice. Sin embargo, todavía no estaría garantizado que funcione..pbxproj
file es en realidad un archivo NeXT / Cocoa PList de estilo antiguo, que es más antiguo y está definido mucho antes que JSON, y ahora está desaprobado por Apple. (pero todavía lo están usando en algunos lugares) La mención sobre el archivo en el libro es completamente incorrecta. Eliminé el voto en contra porque lo mencionaste explícitamente.Creé una secuencia de comandos de Python que puede manejar conflictos de fusión en archivos de XCode Project.
Si quieres probarlo, puedes consultarlo aquí: https://github.com/simonwagner/mergepbx
Tendrá que instalarlo como un controlador de fusión, por lo que se llamará automáticamente cuando tenga un conflicto de fusión en su archivo de proyecto (el archivo README.md le dirá cómo hacerlo).
Debería funcionar mucho mejor que usar
merge=union
comomergepbx
entiende la semántica de su archivo de proyecto y, por lo tanto, resolverá el conflicto correctamente.Sin embargo, el proyecto sigue siendo alfa, no espere que comprenda todos los archivos de proyecto que existen.
fuente