Comment utiliser git-tfs et idiomatic git branching sur un référentiel TFS?

Comment utiliser gittfs idiomatiquement?

  • Le git idiom consiste à extraire les twigs dans le répertoire racine du référentiel. Extraire une twig remplacera le contenu du répertoire par le contenu de cette twig.

  • L’idiome TFS consiste à extraire chaque twig d’un répertoire différent sous le répertoire racine du référentiel (même la twig maître ou la twig). Extraire une twig le placera dans un nouveau répertoire à côté de celui en cours.

En utilisant git-tfs , je peux cloner un repository ou une twig TFS dans un repository git. Je veux travailler sur un référentiel TFS avec plusieurs twigs d’une manière compatible avec l’idiome de twigment git . Mais je ne suis pas sûr de ce qui est techniquement possible ou recommandé 🙂


Cloner le repository complet de TFS

Si je clone tout le référentiel hors de TFS

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

Cela me donnerait un git master contenant toutes les twigs de TFS en tant que répertoires.

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

Ajouter une twig distante par twig TFS

Je ne sais pas si je peux (ou comment) mapper une télécommande git sur chaque twig TFS.

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

alors

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

Je sais que c’est techniquement incorrect, mais je ne connais pas mieux sans jouer (mon seul repo TFS est très grand, l’expérimentation prend beaucoup de temps)

Il est maintenant possible de faire en sorte que les twigs TFS soient des twigs Git correctes si vous clonez avec git-tfs . Ceci est maintenant dans la version stable! Vous commencez par cloner non pas l’intégralité du référentiel mais le tronc:

 git tfs clone http://:8080 $/main/trunk 

Ensuite, vous lancez branch --init , qui crée une nouvelle twig dans le repository Git

 git tfs branch --init $/MyProject/MyTFSBranch 

dans ton cas :

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

Ou utilisez l’indicateur --all sur un nouveau référentiel cloné pour créer TOUTES les twigs présentes sur le serveur TFS.

 git tfs branch --init --all 

Vous pouvez également cloner directement avec toutes les twigs à l’aide de l’ --with-twigs flag --with-twigs :

 git tfs clone http://:8080 $/main/trunk --with-twigs 

La documentation de cette nouvelle commande est ici . N’hésitez pas à nous faire part de vos commentaires pour l’améliorer …

Voici un moyen d’y parvenir, tout en maintenant certaines relations entre le maître et les twigs. Vous voudrez probablement le scripter. Excusez-moi si j’utilise les instructions bash plutôt que la ligne de commande Windows pour certains de mes exemples

Clonez tout d’abord le repository complet, comme dans votre premier exemple, avec des twigs comme répertoires.

Cela déplace le tronc à la racine. (j’espère qu’il n’y a pas de conflits avec vos dossiers de twig)

 mv trunk/*.* . 

Engagez votre nouveau maître

 git commit -a -m "refactoring master" 

créer une nouvelle twig

 git checkout -b feature-login 

Copiez les fichiers de twig sur les fichiers racine

 mv feature-login/*.* . 

Vous n’en avez plus besoin ici

 rm -rf [all_branch_directories] 

Engager la twig

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

retour au maître

 git checkout master 

Fais le tout encore

 git checkout -b next_branch 

etc..

Enfin à la fin

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

Ce n’est pas parfait, mais vous vous retrouvez avec toutes vos twigs clonées hors master et diffèrent plus ou moins correctement. AFAIK git devrait être correct si vous écrasez un fichier avec un autre fichier mais que le contenu ne change pas, ce qui permet à tout le monde de travailler.

L’inconvénient est que vous n’effacez aucun fichier dans les twigs qui ont été supprimées du tronc. Cela peut ou peut ne pas être un problème pour vous …

Qu’en est-il de plusieurs tfs-repos distants, 1 par twig? j’ai la structure suivante:

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

ce que j’ai fait

 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 

alors vous pouvez créer une twig pour chaque twig distante: git checkout -b localbranch1 tfs/Branch1 et valider dans la twig git tfs ct -i branch1

Pour pouvoir facilement fusionner les deux lignes, créez un greffon:

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

où les identifiants sont le hash de la première twig commit (du référentiel Releases) et un identifiant de validation parent (find manuellement)

PS: j’obtiens une erreur: le répertoire de repository git spécifié n’est pas vide non plus (je ne sais pas comment ça fonctionnait auparavant), alors j’ai ajouté manuellement la deuxième URL dans .git / config et j’ai git tfs fetch -i Branch1