Versionado de archivos con SVN

Hacer un videojuego o un proyecto machinima implica mantener en orden miles de archivos. ¿Cómo puedes tener un registro de todo y a la vez una copia de seguridad? Con el versionado de archivos puedes. Aquí muestro cómo usarlo.

El versionado de archivos, o sistema de control de versiones, permite mantener múltiples copias de los archivos de un proyecto, permitiéndote por ejemplo volver a un estado anterior en caso de corrupción de archivos, o simplemente porque el antiguo era mejor. Usando un sistema de control de versiones varias personas pueden trabajar en un proyecto, y no existe el miedo de que vaya a ocurrir pérdida de datos, porque cada archivo tiene varias versiones anteriores a las que puedes volver en caso de problemas.


Cómo usar SVN en Windows

Primero, debes establecer un servidor de SVN. Este puede ser local, en un computador de red o puedes usar un servicio de servidores de SVN. Esto te permitiría trabajar a distancia con otros a través de la red. Aquí voy a usar un servidor gratuito llamado Assembla.

Instala TortoiseSVN

TortoiseSVN es un cliente de SVN para Windows, muy fácil de usar. Descarga la última versión para tu plataforma: http://tortoisesvn.net/downloads.html. Hay versiones para Windows 32 bits y 64 bits.

Crea un repositorio en Assembla

Assembla ofrece un servicio de hosting de SVN gratuito. Entra a http://www.assembla.com y crea una cuenta gratuita. Assembla te da 2 GB de espacio, y puedes crear todos los repositorios que quieras. Existen planes de pago con más espacio por si los necesitas.

Dentro de Assembla, busca la dirección de tu repositorio nuevo y copia la URL.

Descarga la última versión de tu proyecto

En tu sistema de archivos, busca una carpeta donde quieras bajar tu proyecto. Por ejemplo, en C:. Haz clic derecho y selecciona SVN Checkout. Pega aquí la URL de tu repositorio. Abajo ingresa la ruta donde quieres bajar el proyecto. Dale clic a Aceptar y te pedirá tus credenciales. Una vez autenticado, aparecerá la ventana de trabajo de TortoiseSVN mostrándote los cambios que ha bajado. Aparecerá tu carpeta de proyecto con una marca verde encima. Esto significa que la carpeta está sincronizada, y no hay cambios locales en su interior.

Dentro de la carpeta, cada vez que empieces a trabajar, haz clic derecho y selecciona SVN Update. Esta operación trae los cambios más recientes desde el servidor a tu carpeta local.

Para agregar archivos al proyecto

Crea una carpeta nueva o mueve algún archivo de tu proyecto a esta carpeta. Las cosas nuevas tendrán una marca azul, que significa que aún no están dentro del servidor versionadas. Para agregar nuevos elementos, haz clic derecho sobre la selección y elige Tortoise SVN -> Add. Con esto quedan marcados para ser añadidos al servidor más adelante. Ahora, para sincronizar los cambios al servidor, haz clic derecho en alguna parte vacía y selecciona SVN Commit… Haciendo Commit envías todos los cambios locales al servidor, ya sean agregar, modificar o eliminar archivos.

Para quitar archivos del proyecto

Por defecto el repositorio crea una carpeta llamada trunk, puedes eliminarla si quieres. Pero fíjate bien: si eliminas la carpeta normalmente y luego haces SVN Update, la carpeta será restaurada, porque el servidor asume que no la borraste intencionalmente. Esto es perfecto para recuperar versiones antiguas de un archivo o archivos que borraste accidentalmente. Pero en este caso queremos deshacernos de esta carpeta, así que tienes que hacerle clic derecho y seleccionar Tortoise SVN -> Delete. Esta operación marca la carpeta para ser borrada del servidor en el siguiente Commit.

Para renombrar archivos

Lo mismo pasa con renombrar cosas. Si renombras un archivo directamente, SVN no lo reconocerá y lo reportará como nuevo, y el antiguo como perdido. Si haces Update en este momento, SVN restaurará la última versión del archivo con el nombre anterior, y ahora tendrás dos copias del archivo. Para renombrarlo correctamente, hazle clic derecho y selecciona TortoiseSVN -> Rename.

Cómo usar SVN con un proyecto de UDK

Este es el proceso que sigo yo. Mi proyecto de UDK no requiere programación, es solo contenido, por lo que en teoría no debería tocar ninguna carpeta más arriba del directorio Content. Esto es útil por si quieres ir actualizando la versión de UDK todos los meses sin romper el proyecto.

Crea tu repositorio de SVN normalmente, y crea dentro de este una carpeta con el nombre de tu proyecto. No importa que esté en la raíz, luego tú eliges a qué carpeta caerán los archivos desde el repositorio.

Entra a la carpeta del proyecto de UDK y ubica la carpeta Content. Ahí dentro, haz clic derecho y selecciona SVN Checkout… Pon la dirección de tu repositorio y haz clic en el botón con los puntos suspensivos (…) para seleccionar una carpeta específica dentro del repositorio. Selecciona la carpeta con el nombre del proyecto. Ahora esa carpeta quedará dentro de Content y se pueden añadir archivos desde UDK sin problemas. Recuerda siempre hacer SVN Commit para subir tus cambios al repositorio.

Para actualizarte a una versión más reciente de UDK (que salen todos los meses), instálala normalmente y repite este proceso, pero en la carpeta Content de la nueva versión. Luego puedes borrar el UDK antiguo si quieres, pero te recomiendo tener por lo menos la versión anterior a la actual por si se rompió algo o si necesitas archivos que ahora no están.

Tips

Espacio en disco

Si ves las propiedades de una carpeta que tienes en un repositorio, vas a ver que pesa casi el doble de lo normal. Esto es porque SVN maneja archivos internos ocultos para llevar registro de los cambios a los documentos. Esto es normal. Cuando copies archivos del repositorio a otro lugar, tienes dos alternativas: borrar manualmente la carpeta .svn desde cada una de las carpetas que copiaste, o usar el comando Export, que hace la misma operación automáticamente.

Te recomiendo que no versiones archivos demasiado grandes; si bien SVN es inteligente y solo transfiere y guarda las diferencias entre versiones, si son archivos demasiado grandes tu disco se llenará muy rápido, y el del servidor también. Esto es crítico cuando usas un servidor gratuito pero de espacio limitado como Assembla.

Resolviendo conflictos

Si otra persona modifica el mismo archivo que tú y lo envía al servidor, tú estarás trabajando con una versión obsoleta. Si intentas enviar al servidor tu archivo y ya hay en el servidor una versión más reciente, se producirá un conflicto. Al hacer una operación de Commit o Update, el archivo aparecerá en rojo en la lista, y se te indicará que hay un conflicto. Para resolverlo, tienes tres opciones: Resolve to theirs, que elimina tu archivo y se queda con el que ya estaba; Resolve to mine, que descarta el archivo que ya estaba y lo reemplaza con el tuyo, o Merge, que te da la opción de revisar los cambios que se han hecho en tu lado y en el otro, y propone combinarlos. Esto solo es posible con archivos de texto, no se puede con imágenes ni archivos binarios.

Para evitar estos problemas se puede usar el comando Get Lock, para limitar el uso de un archivo a un usuario a la vez, pero es más práctico simplemente tener una buena comunicación con tu equipo para evitar conflictos.