Usando Control de versiones con Unity3D

Este artículo pretende ser una guía definitiva sobre cómo controlar adecuadamente la versión de sus proyectos de Unity.!

El control de versiones es una de las herramientas más importantes en el arsenal de cualquier desarrollador. Le permite revertir cambios fácilmente si rompe algo accidentalmente, compara versiones antiguas y nuevas de su código para ver qué es diferente, y permite que los equipos trabajen en el mismo código sin sobrescribir accidentalmente el trabajo de los demás. Hasta hace poco, solo los proyectos de Unity Pro podían controlarse adecuadamente la versión. Sin embargo, desde Unity 3.5, ahora también es posible controlar los proyectos de control de versiones en la versión gratuita de Unity..


¿Qué es el control de versiones??

Un sistema de control de versiones, o VCS, realiza un seguimiento de los cambios que ha realizado en los archivos en la carpeta, también conocida como su "copia de trabajo". Estos cambios se almacenan junto con la carpeta en una base de datos conocida como "repositorio". Cada vez que cambie algo en su copia de trabajo, debe confirmar esos cambios en el repositorio. El VCS luego compara lo que ya está en el repositorio con los cambios entrantes y solo almacena las diferencias. Esto mantiene el repositorio lo más pequeño posible..

Para este proyecto, usaremos Mercurial, que es un VCS distribuido. A diferencia de los sistemas VCS centralizados como Subversion (SVN), que generalmente dependen de un repositorio remoto almacenado en un servidor, un VCS distribuido puede alojar repositorios locales, a veces llamados "sucursales locales", directamente en su computadora. Esto significa que puede hacer cambios, enviarlos a su sucursal local, probarlos e incluso descartarlos si algo se rompe, todo sin tener que someter a los miembros de su equipo a los cambios hasta que sepa que son perfectos. Una vez que esté seguro, puede "empujar" esos cambios a un repositorio remoto para que su equipo "arrastre" a sus propias sucursales locales.


Preparando un proyecto de Unity para el control de versiones

Un proyecto de Unity requiere cierta metainformación para recordar qué componentes y conexiones se establecen en los diversos activos. Tradicionalmente, esta información meta se almacenaba como un conjunto de archivos binarios en la carpeta Biblioteca de un proyecto de Unity. Sin embargo, este "blob binario" no se puede fusionar correctamente, por lo que los cambios realizados por dos personas podrían pisotear entre sí, causando que se rompan cosas en el editor, incluso si estuvieran editando diferentes activos..

La solución a esto es activar archivos Meta en la configuración del proyecto.

  • Haga clic en Editar> Configuración del proyecto> Editor
  • Bajo la Control de versiones rumbo, cambia el Modo a Archivos meta
  • Haga clic en Archivo> Guardar

Esto hará que Unity cree metarchivos junto a cada activo en la carpeta de Activos del proyecto. Ahora, cuando se modifica un activo en el editor, solo el activo y su archivo meta asociado informarán los cambios, en lugar de toda la carpeta de la Biblioteca.


Instalando Mercurial

Tanto Windows como OSX tienen instaladores de Mercurial. Visite el sitio web de Mercurial y haga clic en el botón de descarga grande. El sitio reconocerá automáticamente qué sistema operativo está utilizando y descargará el instalador adecuado.

Descomprima el instalador y ejecútelo. Haga clic en todos los pasos y debería instalarse sin la intervención necesaria..

Para asegurarse de que Mercurial se haya instalado correctamente, abra una línea de comandos. En Windows, presione comienzo y escriba cmd en el cuadro de búsqueda. En OSX, abierto Destacar y buscar terminal.

En la línea de comando, ingrese:

 hg .

Debería aparecer una breve lista de información que incluye la versión de Mercurial que está utilizando, así como una lista de comandos comunes. Para obtener la lista completa de comandos, ingrese:

hg ayuda

Y para obtener ayuda sobre un comando específico, simplemente ingrese el nombre del comando después de la ayuda:

hg ayuda clon

NOTA: Los comandos mercuriales siempre comienzan con hg, El elemento para el mercurio en la tabla periódica. Afortunadamente, este poco de nombre inteligente se usó porque es fácil de escribir.


Inicializando el repositorio

Lo primero que debemos hacer es darle a nuestra carpeta de proyectos un repositorio.

En la línea de comando ingrese:

hg init

Eso es. Nuestra carpeta ahora tiene un repositorio y está lista para el control de versiones. Si tienes archivos ocultos activados, notarás una .hg carpeta se ha creado en la carpeta del proyecto. Aquí es donde reside el repositorio. Si, por alguna razón, alguna vez desea eliminar el control de versiones, simplemente elimine el .hg carpeta. Su copia de trabajo de los archivos será ilesa.


Comprobando el estado

Ahora que nuestra carpeta de proyectos tiene un repositorio, verifiquemos el estado del repositorio para ver qué ha cambiado. Mercurial aceptará nombres de comandos abreviados, por lo que cualquiera de los siguientes funcionará:

 hg status hg stat hg st

Un informe de estado debe presentar una lista de archivos, cada uno con una sola letra al lado. En este caso, todos los archivos tendrán signos de interrogación al lado. El signo de interrogación indica que el archivo aún no se está controlando la versión en el repositorio.

? Un archivo que está en la copia de trabajo pero no está siendo rastreado por el repositorio.
! Un archivo que está siendo rastreado por el repositorio pero que falta en la copia de trabajo.
UNA Un archivo que se ha agregado al repositorio desde la última confirmación.
METRO Un archivo que ha sido modificado desde la última confirmación..
R Un archivo que está programado para ser eliminado del repositorio en la próxima confirmación.

Agregar archivos al repositorio

Necesitamos agregar archivos explícitamente a nuestro repositorio para que Mercurial sepa que queremos que sean controlados por versión..

Se pueden agregar archivos individuales:

 hg add myfile.txt

Se pueden agregar carpetas enteras:

hg agregar scripts /

Agreguemos cada archivo único sin versión (con un ? signo de interrogación en el informe de estado) de un solo golpe al no especificar ningún nombre de archivo en absoluto:

hg agregar

Realizar una comprobación de estado.

estado de hg

Todos los archivos que se agregaron ahora deben tener una letra UNA junto a ellos, lo que indica que se han agregado al repositorio y ahora están siendo rastreados por Mercurial.


Cometiendo cambios

Ahora que le hemos dicho a Mercurial qué archivos queremos que sean controlados por versión, debemos enviarlos al repositorio. Cada confirmación es como una instantánea conocida como revisión, que realiza un seguimiento de las diferencias entre las revisiones anteriores y la actual.

Hay dos partes en cualquier confirmación, un mensaje y su nombre de usuario. El mensaje es donde puedes describir lo que hiciste, pero hazlo corto y dulce. El nombre de usuario es solo un identificador para que cualquier otra persona que pueda usar el repositorio sepa quién realizó ciertos cambios. El nombre de usuario se establece con el -tu bandera y el mensaje se establece con el -metro bandera:

hg commit -u ian -m "inicial"

Para asegurarnos de que la confirmación fue exitosa, necesitamos verificar el registro:

registro de hg

Para estar completamente seguro, verifique el estado para asegurarse de que no haya cambios..

estado de hg

Un informe de estado vacío significa que todo se cometió correctamente.

NOTA: Se recomienda que te comprometas a menudo. Cada compromiso debe ser tan "atómico" como sea posible. Es decir, debería describirse fácilmente con una frase simple como "aumento de la altura de salto del jugador". Si necesita usar "y" o comas en sus mensajes de confirmación, entonces es probable que sea el momento de realizar dos confirmaciones separadas. La razón de esto es para hacer que sea más fácil deshacer los cambios específicos que ha realizado cuando encuentra problemas.


Corrigiendo errores

Hay dos formas clave de corregir errores: una reversión o una reversión. Una reversión deshará el último comando que ingresó, lo cual es ideal para corregir los errores de ortografía en sus mensajes de confirmación o agregar celosamente..

 hg rollback

Realice una verificación de estado para asegurarse de que todo se restaure correctamente.

 estado de hg

Una reversión es más poderosa, lo que le permite viajar en el tiempo a través de varias revisiones, en caso de que necesite deshacerse de varios cambios que haya realizado. Para saber qué revisión querrá volver a usted, primero debe verificar el registro:

 registro de hg

El número o el hash se pueden usar para referirse a una revisión específica mientras se revierte. El número es específico de su repositorio, ya que la rama de otra persona podría tener más cambios, por lo que sus números serían diferentes. El hash es universal, esto significa que cualquiera podría volver a una revisión específica en un repositorio compartido utilizando esa cadena de hash.

Para volver a una revisión específica, necesitamos especificar el número de revisión usando la -r bandera. También debemos decirle a Mercurial que "revertir todo" usando el -una bandera. Finalmente, debemos decirle a Mercurial que no queremos que cree ningún archivo de respaldo usando --sin respaldo bandera.

 hg revert -r 0 -a --no-backup

Realice una verificación de estado para asegurarse de que todo revertido correctamente.

 estado de hg

NOTA: Si omites el --sin respaldo indicador, Mercurial creará archivos de respaldo para cualquier archivo afectado por el procedimiento de reversión. Estos archivos de copia de seguridad tendrán todos .orig extensión. Asegúrese de no agregar .orig archivos.


Ignorar archivos no deseados

Ahora que hemos deshecho nuestro error, asegurémonos de que no vuelva a suceder. Queremos ignorar permanentemente las carpetas Library y Temp para que no se puedan agregar accidentalmente la próxima vez que tengamos contento con el comando add.

Mercurial usa un archivo especial llamado .hgignore para almacenar los nombres de los archivos y carpetas que desea ignorar permanentemente. Este archivo va directamente a la carpeta de su proyecto y se controla la versión como todo lo demás. Esto asegura que todos los que usan el repositorio no pueden contaminarlo accidentalmente con archivos no deseados.

Usando su editor de texto favorito para ingresar lo siguiente:

 sintaxis: glob Library Temp * .pidb * .sln * .userprefs * .csprog * .orig

Esto le dice a Mercurial lo que queremos usar sintaxis de estilo shell (conocida como sintaxis "glob") para ignorar las carpetas Library y Temp, ignorar varios archivos temporales que crea MonoDevelop e ignorar .orig archivos por si acaso los creamos accidentalmente al revertir.

Guarde el archivo en la raíz de la carpeta de su proyecto como .hgignore (notando el punto al principio). Luego realice otra verificación de estado:

estado de hg

los .hgignore el archivo ahora debería aparecer en el informe de estado, pero la carpeta de la Biblioteca, la carpeta Temp y otros archivos ignorados no deberían. Por lo tanto, podemos usar el comando agregar de manera segura sin necesidad de usar nombres de archivo exactos y luego confirmar los resultados.

 hg agregar hg commit -u ian -m "Inicial"

Compruebe el registro para asegurarse de que la confirmación fue exitosa.

registro de hg

NOTA: Más información sobre los archivos hgignore se puede encontrar aquí.


Empujar cambios a un repositorio remoto

Si desea compartir su repositorio con otros desarrolladores, la forma más sencilla es crear un repositorio remoto en un servidor y enviar los cambios a ese..

Lo primero que debes hacer es encontrar un host de Mercurial. Varios existen incluyendo BitBucket y Kiln; Ambos tienen cuentas gratuitas para equipos pequeños. En nuestro caso, usaremos BitBucket, pero ambos servicios funcionan esencialmente igual. Una vez que se haya registrado en una cuenta en cualquiera de los servicios, asegúrese de crear un nuevo repositorio con su interfaz web.

Una vez creado, busque la "ruta de clonación". Debería verse algo como esto:

hg clone https://bitbucket.org/username/reponame

Normalmente, este comando se usaría para crear una copia local del repositorio. Pero ya tenemos un repositorio local y, en su lugar, queremos enviar cambios al repositorio remoto. Para hacer esto, podemos tomar la dirección URL al final de la cadena de clonación y usarla como destino para el comando push.

hg push https://bitbucket.org/username/reponame

Mercurial comparará el repositorio local con el repositorio remoto para ver en qué se diferencian. Verá que nuestro repositorio local tiene cambios más recientes, falta el repositorio remoto y los enviará al repositorio remoto.

Sin embargo, primero solicitará un nombre de usuario y una contraseña. Estos deben corresponder al nombre de usuario / correo electrónico y la contraseña con la que se inscribió en el servicio de host..

Mercurial debe informar que todos los cambios fueron impulsados ​​exitosamente y eso significa que cualquier persona que dependa de su repositorio ahora puede "tirar" de él para recibir sus cambios. Primero, tendrán que clonar el repositorio para hacer una copia local.

hg clone https://bitbucket.org/username/reponame

Y luego extraiga cualquier cambio que usted o cualquier otra persona haga a medida que pasa el tiempo:

hg pull

Luego tendrá que hacer una "actualización" para asegurarse de que su copia de trabajo esté actualizada:

actualización de hg

Pero para ahorrar tiempo, puede hacer la extracción y actualizar todo de una vez utilizando el -tu bandera:

hg pull -u

NOTA: Mercurial le avisará cada vez que se actualice o fusione un archivo binario. A menos que esté seguro de haber realizado cambios en los archivos binarios locales, elija siempre el "(O) otro" opción en lugar de la "(Local" opción.


Ajustes para hacer la vida más fácil

Hay varios aspectos tediosos para emitir los mismos comandos una y otra vez, como tener que acordarse de proporcionar un nombre de usuario al cometer, tener que escribir una contraseña cada vez que se presiona, etc. Muchos de estos ajustes se pueden almacenar en lo que se conoce como un hgrc expediente. Para crear un hgrc archivo, use su editor de texto favorito e ingrese lo siguiente:

 [rutas] por defecto = https://bitbucket.org/username/reponame

Esto le indica a Mercurial qué ruta debe utilizar por defecto para los comandos de inserción y extracción. Asegúrese de reemplazar esta dirección falsa con la dirección real de su repositorio remoto. A continuación, ingrese lo siguiente:

 [ui] nombre de usuario = Nombre Apellido

Esto le indica a Mercurial qué nombre de usuario debe usar de forma predeterminada cuando se comprometa. Una vez más, reemplaza esto con tus credenciales correctas y asegúrate de que la dirección de correo electrónico coincida con la que te registraste. Finalmente, introduzca:

 [auth] host.prefix = bitbucket.org host.username = username host.password = contraseña host.schemes = http https

Esto le indica a Mercurial qué credenciales debe usar al enviar a un repositorio remoto seguro para que no tenga que ingresar un nombre de usuario y contraseña cada vez que presione o tire. Asegúrese de reemplazar el prefijo con la parte más corta posible de la dirección de su host y no incluya la http: // Protocolo en el prefijo tampoco. A continuación, reemplace el nombre de usuario y la contraseña con el nombre con el que se registró en su host. El esquema le dice a Mercurial con qué protocolos intentar conectarse.

Finalmente, guarde el archivo como hgrc (sin punto ni extensión en el extremo) dentro la .hg carpeta en tu repositorio. Ya no debería tener que proporcionar manualmente nombres de usuario, contraseñas o rutas al emitir comandos a partir de ahora.


Conclusión

El control de versiones puede parecer un poco desalentador para los no iniciados, pero el esfuerzo vale la pena. Le da tranquilidad saber que en cualquier momento puede revertir un proyecto roto al punto en el que estaba trabajando antes. Del mismo modo, el uso de repositorios remotos significa que el código no solo se puede compartir con los miembros del equipo, sino que recuperar su proyecto después de que ocurra algo catastrófico (como una falla del disco duro) es fácil.

Para obtener más información sobre el control de versiones distribuido y Mercurial, recomiendo visitar Hg Init. Tiene una serie de artículos que explican en profundidad las prácticas de control de versiones y las características de Mercurial. Es breve, altamente informativo, fácil de leer, fácil de entender e incluso un poco divertido.