xcode git

xcode - Git y pbxproj



(4)

El archivo pbxproj no es realmente humano fusionable. Si bien es un texto ASCII simple, es una forma de JSON. Esencialmente quieres tratarlo como un archivo binario.

Esto es lo que hacen las banderas individuales:

-crlf: no use crlf <=> cr conversion

-diff: no difiera el archivo

-merge: no intente fusionar el archivo

Del libro Pro Git de Scott Chacon

Algunos archivos parecen archivos de texto, pero a todos los efectos se deben tratar como datos binarios. Por ejemplo, los proyectos de Xcode en la Mac contienen un archivo que termina en .pbxproj, que es básicamente un conjunto de datos JSON (formato de datos de texto sin formato javascript) escrito en el disco por el IDE que registra la configuración de compilación, etc. Aunque técnicamente es un archivo de texto, porque es todo ASCII, no desea tratarlo como tal porque es realmente una base de datos liviana: no puede combinar el contenido si dos personas lo cambiaron, y las diferencias generalmente no son útiles. El archivo está destinado a ser consumido por una máquina. En esencia, quieres tratarlo como un archivo binario.

Estaba buscando una aplicación de código abierto para Mac, y me dieron algunos valores sugeridos para .gitignore. Eran lo que yo esperaría ...

Sin embargo, también sugirieron una entrada en un archivo .gitattributes:

*.pbxproj -crlf -diff -merge

No soy el más entendido en términos de git, así que me preguntaba: ¿cuáles son exactamente los beneficios de agregar esta línea? ¿Qué hace en particular? Solo he visto esto sugerido en este único proyecto , y si fuera una práctica normal, hubiera esperado verlo en otro lugar ahora mismo. Así que tenía curiosidad acerca de cómo se aplica específicamente al archivo pbxproj.


Escribí una secuencia de comandos de Python llamada xUnique para resolver este problema de conflicto de combinación.

Este script hace las siguientes cosas:

  • reemplace los UUID 24 caracteres por los compendios MD5 de 32 caracteres exclusivos del proyecto, y elimine los UUID no utilizados (generalmente causados ​​por una combinación descuidada antes). Esto evitaría los UUID duplicados porque diferentes máquinas / Xcode generan diferentes UUID en este archivo. Xcode lo reconoce y el proyecto podría abrirse. Durante este proceso, elimine todas las líneas inválidas en el archivo de proyecto
  • ordenar el archivo de proyecto. Escribí una versión de Python de sort-Xcode-project-file del equipo de Webkit con más características nuevas:
    • Soporte para ordenar las secciones PBXFileReference y PBXBuildFile
    • eliminar archivos duplicados / refs
    • evitar la creación de un nuevo archivo, incluso si no se realizan cambios, esto hace menos confirmaciones después de usar este script

Más detalles y actualizaciones de xUnique, consulte README


Me enfrenté al problema de corrupción del archivo *.pbxproj después de resolver los conflictos de combinación manualmente. O, más a menudo, mis archivos simplemente ''desaparecieron'' del árbol de trabajo después de la fusión. Me volví loco porque trabajamos en equipo, así que puedes imaginar lo desordenado que puede llegar a ser muy rápido.

Por lo tanto, he probado merge=union y funciona bien hasta ahora. Sé que no puede ayudar si los archivos se eliminaron o cambiaron de nombre al mismo tiempo, pero para agregar nuevos archivos funciona como se esperaba: no hay conflictos y los archivos no desaparecen después de la combinación. Y también ahorra un poco de tiempo.

Si quieres probarlo, aquí está lo que hice.

1) Crear un archivo global .gitattributes. Ejecutar en la terminal:

touch ~/.gitattributes git config --global core.attributesfile ~/.gitattributes

2) Este comando debería abrirlo en un editor de texto:

open ~/.gitattributes

3) Cuando se abra el archivo, agregue esta línea y guarde el archivo:

*.pbxproj binary merge=union

Hecho. Espero que esto ayude a los nuevos lectores como me ha ayudado.


Una diferencia es a menudo útil en el momento de la confirmación para comprobar qué se ha cambiado. Así que me parece útil mantener la habilidad de diferenciar, pero solo evitar la fusión. Así que uso esto en mi archivo .gitattributes:

* .pbxproj -crlf -merge

En otra nota, ¿alguien ha intentado usar merge = union para archivos pbxproj? Ver: ¿Debo combinar archivos .pbxproj con git usando merge = union?