Cómo migrar de TFS a GIT

git-tfs_logo.png

Fuente: GitHub

En este manual explicaré cómo realizar una migración completa de un repositorio 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:

Instalación de 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

2017-04-23_02h36_24.png

Instalación de SourceTree

La instalación requiere que crees una cuenta en Atlassian. Durante la instalación, te solicitará información del repositorio remoto; puedes omitirla, ya que en este tutorial no usaremos repositorios remotos de GIT.

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 dando clic derecho en el folder y seleccionando “Convert to branch”.

Empieza por el folder principal, 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.

*La conversión no causa ninguna pérdida de información.

2017-04-23_03h15_26.png

2017-04-23_03h16_45

Migrar a GIT

Descarga la librería de git-tfs (http://git-tfs.com/) y descomprimela en la carpeta de tu preferencia. Como recomendación, descomprimela en el directorio más cercano a la raíz (ej. C:\ en Windows) ya que si el repositorio a migrar tiene muchas sub carpetas, puede haber problemas por la cantidad de caractéres.

Abre una línea de comandos y entra a la carpeta en donde descomprimiste 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:

  • –branches=none: Migra solo el branch que hayas especificado
  • –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.

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” 2017-04-23_03h21_34.png
  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”).2017-04-23_03h22_49.png
  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.

2017-04-23_03h25_44.png

 

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
  • Entre otros

Todos ellos se pueden resolver de la siguiente manera:

  1. Deten el proceso de migración.
  2. Con SourceTree, abre el repositorio y envialo a un remote repo.
  3. En TFS, verifica el ultimo commit realizado en el branch que se quedó ciclado o marcó error.
  4. Ejecuta el comando de migración, especificando un –changeset mayor al ultimo commit, es decir, la migración se brincará a la rama en cuestión.
    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. Asignale 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”.2017-04-23_03h32_30.png
  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.

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s