¿Cómo uso git-tfs y la ramificación idiomática de git contra un repositorio TFS?


¿Cómo Uso git-tfs Idiomáticamente?

  • El modismo de git es revisar las ramas al directorio raíz del repositorio. La comprobación de una rama reemplazará el contenido del directorio con el contenido de esa rama.

  • El modismo de TFS es revisar cada rama en un directorio diferente bajo el directorio raíz del repositorio (incluso la rama maestra o troncal). La comprobación de una rama la colocará en un nuevo directorio siguiente a la actual.

Usando git-tfs, puedo clonar un repositorio TFS o una rama en un repositorio git. Quiero trabajar en un repositorio TFS con múltiples ramas de una manera consistente con el modismo de ramificación de git. Pero no estoy seguro de lo que es técnicamente posible o recomendado:)


Clonar Todo El Repositorio TFS

Si clono todo el repositorio de TFS

> git tfs clone http://<tfsurl>:8080 $/main

Eso me daría un git master conteniendo todas las ramas TFS como directorios.

[master]> dir
  trunk
  feature-logon
  feature-search
  release-0.0.1

Agregar un Control Remoto Por Rama TFS

No se si puedo (o como) mapear un git remote a cada rama de TFS.

> git init .
[master]> git tfs clone http://<url> $/main/trunk .

Entonces

[master]> git checkout -b feature-logon
[feature-logon]> git tfs clone http://<url> $/main/feature-logon .

Sé que esto es técnicamente incorrecto, pero no lo conozco mejor sin jugar (mi único repositorio TFS es muy grande, experimentar está tomando mucho tiempo)

Author: Anthony Mastrean, 2011-02-27

3 answers

Ahora es posible obtener que las ramas TFS sean ramas Git correctas si se clonan usando git-tfs. Esto está ahora en la versión estable! Primero clona no todo el repositorio sino el tronco :

git tfs clone http://<tfsurl>:8080 $/main/trunk

Luego ejecuta branch --init, lo que crea una nueva rama en el repositorio Git

git tfs branch --init $/MyProject/MyTFSBranch

En su caso :

git tfs branch --init $/main/feature-logon

O use la bandera --all en un repositorio clonado nuevo para crear TODAS las ramas presentes en el servidor TFS.

git tfs branch --init --all

También podrías clonar directamente con todas las ramas usando flag --with-branches:

git tfs clone http://<tfsurl>:8080 $/main/trunk --with-branches

La documentación para este nuevo comando es aquí. Siéntase libre de proporcionar comentarios para mejorarlo...

 31
Author: riper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-27 09:49:20

Aquí hay una manera de hacer esto, y aún así mantener algunas relaciones entre el maestro y las ramas. Probablemente querrías escribirlo. Excuse me if I use bash statements rather than windows command line for some of my examples

Primero clona todo el repositorio, como en tu primer ejemplo, con ramas como directorios.

Esto mueve el tronco a la raíz. (esperemos que no haya conflictos con sus carpetas de rama)

mv trunk/*.* .

Confirme su nuevo maestro

git commit -a -m "refactoring master"

Creando una nueva rama

git checkout -b feature-login

Copie los archivos de rama sobre los archivos raíz

mv feature-login/*.* .

Ya no los necesito aquí{[10]]}

rm -rf [all_branch_directories]

Confirmar la rama

git commit -a -m "refactoring feature-login"

Volver al maestro

git checkout master

Hazlo todo de nuevo

git checkout -b next_branch

Etc. sucesivamente..

Finalmente al final

git checkout master
rm -rf [all_branch_directories]
git commit -a -m "refactoring master"

No es perfecto, pero terminas con todas tus ramas clonadas de master y diffed más o menos apropiadamente. AFAIK git debería estar bien si sobrescribir un archivo con otro archivo, pero el contenido no cambia, lo que permite que todo esto funcione.

Un inconveniente es que no borrará ningún archivo en las ramas que se haya eliminado del tronco. Esto puede o no ser un problema para usted...

 3
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-06 01:03:35

¿Qué pasa con múltiples tfs-repos remotos, 1 por rama? tengo la siguiente estructura:

$/Root/Main/someproject (the trunk)
$/Root/Releases/Branch1/someproject
$/Root/Releases/Branch2/someproject

Lo que hice

git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Trunk GitRepo
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch1 GitRepo -i 
    branch1
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch2 GitRepo -i branch2

Entonces puedes crear una rama para cada rama remota: git checkout -b localbranch1 tfs/Branch1 y commit en la rama tfs git tfs ct -i branch1

Para poder combinar fácilmente las dos líneas crea un injerto:

echo branch-commit-id trunk-parent-id > .git/infos/grafts

Donde los ids son el hash del commit de la primera rama (del repositorio Releases) y un commit id padre (find manualmente)

PD: Obtengo error: git especificado el directorio del repositorio no está vacío también (no sé cómo funcionaba antes), así que agregué manualmente la segunda url .git / config e hizo git tfs fetch-i Branch1

 3
Author: Boklucius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-12 09:55:59