Cintermex. Av. Fundidora Local 104, Monterrey, NL,México
(81) 8191 8276

Cómo migrar de TFS a GIT

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:

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

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, 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.

2017-04-23_03h15_26.png

 

2017-04-23_03h16_45

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 descomprimela en la carpeta de tu preferencia.

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 (en este ejemplo, se migraría solo el branch “Main”
  • –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 omitirlo.

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.

Leave a reply