¿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)
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...
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...
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
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