En este manual explicaremos cómo migrar de TFS a GIT, conservando el historial completo (commits, autores y fechas de cada cambio, merges entre ramas, etc).

Usaremos las siguientes herramientas/tecnologías:

  1. SourceTree (https://www.sourcetreeapp.com): Cliente de GIT.
  2. Git v2.9.0 (aunque debe funcionar con cualquier versión reciente).
  3. TFS 2010 o superior (no lo he probado en versiones menores). Puede ser un TFS de Cloud Services de Windows o bien un OnPremise.
  4. git-tfs v0.25.1 (http://git-tfs.com/).
Instalación en GIT

Al instalar GIT, verifica que esté en el path global de variables de entorno. Puedes verificarlo abriendo una línea de comandos y ejecutando el siguiente código: git –version

Instalación de SourceTree

La instalación requiere que crees una cuenta en Atlassian, la cual es gratuita. Durante la instalación, omite la configuración del repositorio remoto, ya que en este tutorial no lo utilizaremos.

Preparar TFS

TFS maneja el concepto de “branches” y “folders”. Para poder migrar el repositorio, es obligatorio usar branches.

Si tienes folders, puedes convertirlos en branches (no causa ninguna pérdida de información) dando clic derecho en el folder y seleccionando “Convert to branch”.

*Empieza por el folder principal (del cual se han desprendido el resto de tus folders), ya que al tratar de convertirlo, TFS te ofrecerá convertir todos los sub folders en branches.

En caso de que tengas folders independientes, tendrás que convertirlos a branches uno por uno.

Una vez migrados, puedes dar clic derecho en el branch principal y ver la jerarquía de branches. Esta jerarquía será respetada al realizar la migración a GIT.

Migrar a GIT

Descarga la librería de git-tfs (http://git-tfs.com/) y descomprímela en la carpeta de tu preferencia.

Recomendación: descomprime en el directorio más cercano a la raíz (ej. C:\ en Windows) ya que si el repositorio a migrar tiene muchas subcarpetas, puede haber problemas por la cantidad de caracteres.

Abre una línea de comandos y entra a la carpeta en donde descomprimimos git-tfs.

Clona el repositorio que deseas, utilizando el siguiente comando (es importante que estés posicionado en la carpeta de git-tfs):

git-tfs clone {url de tfs} {repositorio}/{branch a migrar} {directorio donde deseas crear el repositorio de GIT} --branches=all

Ejemplo:

git-tfs clone https:\\tfs.enevasys.com $/enevasys.apps.myapp/Main c:\repoMigrado --branches=all

El parámetro “–branches=all” indica que deseamos migrar el repositorio con todos sus branches.

Otros parámetros que puedes utilizar, son:

  1. –branches=none: Migra solo el branch que hayas especificado (en este ejemplo, se migraría solo el branch “Main”
  2. –changeset={changeset de TFS}: Migra los commits a partir del branch especificado. En caso de que no agregues este parámetro, se migrará el repositorio completo. Por lo pronto, puedes evitarlo.

La migración puede tomar varios minutos e incluso horas, dependiendo del tamaño del repositorio, la cantidad de commits y la cantidad de branches.

En caso de ocurrir algún error, en la sección “Errores comunes” encontrarás distintos escenarios y cómo resolverlos.

Verificar importación

Una vez que termina la importación, verificaremos que el repositorio se haya migrado correctamente:

1. Abre SourceTree selecciona “File -> Clone / New”

blog 23

2. Selecciona la pestaña “Add Working Copy” y en Working Copy Path, selecciona la carpeta que especificaste en la migración (en este caso, “c:\repoMigrado”)

blog 24

3. Da clic en “Add”. Ahora podrás ver todas las ramas migradas (incluyendo master), así como los commits y merges con sus fechas y autores reales.

Errores comunes

Debido a la forma en cómo TFS almacena los metadatos, es posible que algunos escenarios no puedan ser migrados de forma automática. Sin embargo; aquí podrá encontrar alternativas sencillas para resolverlo.

La migración se queda ciclada o marca un error por no encontrar el “parent branch”

Los errores que puede marcar son:

  • Fetching from dependent tfs remote (se queda ciclado)
  • Unable to migrate branch
  • Unable to find parent branch

Todos ellos se pueden resolver de la siguiente manera:

  1. Detén el proceso de migración.
  2. Con SourceTree, abre el repositorio y envíalo a un remote repo.
  3. En TFS, verifica el último commit realizado en el branch que se quedó ciclado o marcó error.
  4. Ejecuta el comando de migración, especificando un –changeset mayor al último commit, es decir, la migración se moverá a la rama en cuestión. (4.1. El comando no te permitirá utilizar el mismo directorio destino, para no borrar la migración previa. Utiliza otro directorio.)
  5. Si vuelve a ocurrir el problema, repite nuevamente este procedimiento desde el 1er paso.
  6. Una vez terminada la migración, abre en SourceTree el nuevo repositorio migrado.
  7. Asigna el mismo remote que utilizaste en el paso 2.
  8. Realiza un fetch.
  9. Al terminar el fetch, realiza un pull asegurandote de que esté seleccionada la casilla de “Use rebase”.
  10. Realiza un push.

La clave en este proceso fue el Rebase del paso 9. Con esto, hacemos “creer” al repositorio que los commits nuevos son parte del mismo repo.

Si gustas recibir más información acerca de cómo ayudamos a las organizaciones a diseñar y ejecutar estrategias de agilidad organizacional (cultura + procesos + tecnología) e implementación de herramientas de Atlassian, envía un correo a asael.sepulveda@enevasys.com.

[ENS] Banners Web