49 votes

Comment utiliser git-tfs et le branching git idiomatique contre un dépôt TFS?

Comment utiliser git-tfs de manière idiomatique ?

  • L'idiome git consiste à vérifier les branches dans le répertoire racine du dépôt. Le fait de vérifier une branche remplacera le contenu du répertoire par le contenu de cette branche.

  • L'idiome TFS consiste à vérifier chaque branche dans un répertoire différent sous le répertoire racine du dépôt (même la branche principale). Vérifier une branche la placera dans un nouveau répertoire à côté de celui actuel.

En utilisant git-tfs, je peux cloner un dépôt ou une branche TFS dans un dépôt git. Je veux travailler sur un dépôt TFS avec plusieurs branches de manière cohérente avec l'idiome du branching git. Mais je ne suis pas sûr de ce qui est techniquement possible ou recommandé :)


Cloner tout le dépôt TFS

Si je clone tout le dépôt depuis TFS

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

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

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

Ajouter un Remote par branche TFS

Je ne sais pas si je peux (ou comment) mapper un remote git sur chaque branche TFS.

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

Ensuite

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

Je sais que ce n'est techniquement pas correct, mais je ne sais pas mieux sans expérimenter (mon seul dépôt TFS est très grand, l'expérimentation prend du temps)

32voto

riper Points 423

Il est désormais possible d'obtenir les branches TFS correctes en tant que branches Git si vous clonez en utilisant git-tfs. C'est maintenant dans la version stable! Vous commencez par cloner non pas l'intégralité du dépôt mais le tronc :

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

Ensuite, exécutez branch --init, ce qui crée une nouvelle branche dans le dépôt Git

git tfs branch --init $/MyProject/MyTFSBranch

dans votre cas :

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

Ou utilisez le drapeau --all sur un dépôt fraîchement cloné pour créer TOUTES les branches présentes sur le serveur TFS.

git tfs branch --init --all

Vous pourriez également cloner directement avec toutes les branches en utilisant le drapeau --with-branches:

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

La documentation pour cette nouvelle commande se trouve ici. N'hésitez pas à fournir des retours pour l'améliorer...

3voto

Joshua Points 2622

Voici une façon de le faire tout en conservant certaines relations entre le master et les branches. Vous voudrez probablement le scripter. Excusez-moi si j'utilise des déclarations bash plutôt que la ligne de commande Windows pour certains de mes exemples

Cloner d'abord tout le référentiel, comme dans votre premier exemple, avec les branches comme répertoires.

Cela déplace le tronc à la racine. (espérons qu'il n'y a pas de conflits avec vos dossiers de branche)

mv trunk/*.* .

Validez votre nouveau master

git commit -a -m "refactorisation master"

création d'une nouvelle branche

git checkout -b feature-login

Copiez les fichiers de la branche dans les fichiers racine

mv feature-login/*.* .

N'en avez plus besoin ici

rm -rf [tous_les_répertoires_de_branche]

Validez la branche

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

retour au master

git checkout master

Faites-le encore une fois

git checkout -b prochaine_branche

etc. etc..

Enfin, à la fin

git checkout master
rm -rf [tous_les_répertoires_de_branche]
git commit -a -m "refactorisation master"

Ce n'est pas parfait, mais vous vous retrouvez avec toutes vos branches clonées à partir du master et différenciées plus ou moins correctement. À ma connaissance, git devrait bien fonctionner si vous écrasez un fichier avec un autre fichier, mais dont les contenus ne changent pas, ce qui permet à tout cela de fonctionner.

Un inconvénient est que vous ne supprimez pas les fichiers des branches qui ont été supprimés du tronc. Cela peut être un problème pour vous ou pas...

3voto

Boklucius Points 997

Que dire des multiples dépôts TFS distants, 1 par branche? J'ai la structure suivante :

$/Root/Main/someproject (le tronc)
$/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

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

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

echo id-commit-branche id-parent-tronc > .git/infos/grafts

où les identifiants sont le hash du premier commit de la branche (du dépôt Releases) et un identifiant de commit parent (à trouver manuellement)

PS : J'ai une erreur : le répertoire du dépôt git spécifié n'est pas vide non plus (je ne sais pas comment cela fonctionnait avant), donc j'ai ajouté manuellement la deuxième URL dans .git/config et j'ai fait git tfs fetch -i Branch1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X