2010-04-10 14 views
84

He sido desarrollador de iphone por un tiempo, y recientemente he incluido git en mi flujo de trabajo. He usado la configuración de git encontrada en http://shanesbrain.net/2008/7/9/using-xcode-with-git para mi flujo de trabajo hasta el momento.¿Cómo usar Git correctamente con XCode?

¿Estas configuraciones le dicen a git que excluya * .pbxproj de las fusiones? ¿Hay alguna razón real para hacer esto? Por ejemplo, cuando agrego un archivo al proyecto y lo empujo al origen, mis compañeros desarrolladores no tendrán ese archivo agregado a su proyecto xcode cuando lo extraigan. Entonces, si uno de ellos crea una versión, este archivo puede no estar incluido. ¿No debería dejar que git maneje las fusiones para el archivo del proyecto? ¿Podría alguien explicar por qué o por qué este archivo no debería estar en combinaciones y cómo manejar adecuadamente la situación cuando se agregan archivos al proyecto? Gracias.

+7

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 ... –

+0

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

+7

*.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. –

Respuesta

124

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 
+2

¿Utiliza un archivo .gitattributes para su proyecto xcode? Y gracias por tu visión. Creo que será mucho más fácil intentar fusionar los archivos pbxproj en el futuro. – rickharrison

+1

Hasta la fecha no lo hemos visto, aunque algunos aspectos de ese aspecto son interesantes, pero las personas con las que he trabajado no han sido usuarios avanzados de git, por lo que la promoción de funciones avanzadas no es sólida. –

+1

"El archivo .pbxproj es simplemente JSON (similar a XML)." En realidad, es una lista de propiedades con formato OpenStep. Las mismas ideas básicas que JSON, pero la sintaxis difiere en algunos lugares. –

2

La respuesta corta es que incluso si no incluye esa línea en .gitattributes, es posible que no pueda fusionar fácilmente dos versiones modificadas de .pbxproj. Es mejor para git tratarlo como un binario.

Ver aquí para más detalles: Git and pbxproj

Actualización: A pesar de que el libro git still agrees con esta respuesta, ya no lo hacen. La versión I controla .pbxproj como cualquier otro archivo fuente no binario.

+0

suena como que podría configurar un filtro de compromiso para enviar el archivo a través de 'simplejson' o algo así en el camino hacia el índice. Sin embargo, aún no estaría garantizado que funcione. – intuited

+1

No es un archivo con formato JSON. Se ve similar pero tiene muchas diferencias en los detalles. – Eonil

+0

Dice su JSON en el libro de git, pero parece que está mal. http://git-scm.com/book/ch7-2.html – huggie

2

hice crear un script en Python que puede manejar los conflictos de fusión en los archivos de proyecto de Xcode.

Si quieres probarlo, puede comprobar que funciona aquí: https://github.com/simonwagner/mergepbx

Usted tendrá que instalarlo como un controlador de combinación, por lo que es llamado automáticamente cuando se tiene un conflicto de combinación en el archivo de proyecto (el archivo README.md te dirá cómo hacerlo).

Debería funcionar mucho mejor que usar merge=union como mergepbx 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 hay por ahí.

5

Francamente, las respuestas existentes son engañosas.

Si nuncaborrar o renombrar archivos, a continuación, utilizando la estrategia merge=union, que acaba combina las diferencias en los distintos comete directamente, es una buena idea.

Sin embargo, en el mundo real, tenemos que eliminar o renombrar archivos a veces. Combinar las diferencias sin ninguna modificación haría muchos problemas en estas situaciones, y estos problemas generalmente conducen a la cuestión de "Integridad del espacio de trabajo: no se pudo cargar el proyecto", lo que hace que incluso no pueda ejecutar el proyecto.

La mejor solución que tengo hasta ahora:

1) El diseño del proyecto bien y añadir todos los archivos necesarios al principio, por lo que tendría pocas veces que necesite cambiar el project.pbxproj.

2) Haga que sus características sean pequeñas. No hagas demasiadas cosas en una rama.

3) Por cualquier motivo, si necesita modificar la estructura de archivos y obtener conflictos en project.pbxproj, use su editor de texto favorito para resolverlos manualmente. A medida que minimiza sus tareas, los conflictos pueden ser fáciles de resolver.