remotes remote create available iphone objective-c xcode git

iphone - create - xcode add remote git repository



¿Cómo usar Git correctamente con XCode? (5)

Creé una secuencia de comandos de Python que puede manejar conflictos de combinación en archivos de XCode Project.

Si quieres probarlo, puedes consultarlo aquí: https://github.com/simonwagner/mergepbx

Tendrás que instalarlo como un controlador de combinación, por lo que se llamará automáticamente cuando tengas un conflicto de fusión en tu archivo de proyecto (el archivo README.md te dirá cómo hacerlo).

Debería funcionar mucho mejor que usar merge=union ya que mergepbx entiende la semántica de su archivo de proyecto y, por lo tanto, resolverá el conflicto correctamente.

Sin embargo, el proyecto todavía es alfa, no espere que comprenda cada archivo de proyecto que está disponible.

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 el momento.

Esos ajustes 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.



Francamente, las respuestas existentes son engañosas.

Si nunca elimina o cambia el nombre de los archivos, entonces es una buena idea usar la estrategia merge=union , que solo combina las diferencias en diferentes commits directamente.

Sin embargo, en el mundo real, necesitamos eliminar o renombrar archivos a veces. Combinar las diferencias sin ninguna modificación crearí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 obtuve hasta ahora:

1) Diseña bien el proyecto y agrega todos los archivos necesarios al principio, por lo que rara vez necesitarás cambiar el project.pbxproj .

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

3) Por cualquier motivo, si necesita modificar la estructura del archivo 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.


He trabajado en aplicaciones de iPhone a tiempo completo desde el lanzamiento de SDK, la mayor parte de ese tiempo lo he pasado trabajando en equipos con múltiples 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 fusión, que para git al menos simplemente implica eliminar cualquier >>>>, <<<< y ==== líneas. 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 de git, lo ejecuto desde el directorio del proyecto (en el 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

En el peor de los casos, 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ñalada en los comentarios a continuación) que puede intentar usar en lugar de la secuencia de comandos, es agregar esta línea a un archivo .gitattributes:

*.pbxproj text -crlf -diff -merge=union

Entonces git siempre tomará los dos lados de una fusió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 quieres, en mi caso realmente solo quedan los restos y todo el directorio de compilación:

# xcode noise build/* *.pbxuser *.mode1v3 *~ # old skool .svn # osx noise .DS_Store profile


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.

Mira aquí para más detalles: Git y pbxproj

Actualización: Aunque el libro de git todavía está de acuerdo con esta respuesta, ya no lo hago. La versión de control mi .pbxproj al igual que cualquier otro archivo fuente no binario.