Déplacer et Renommer sont des alias. Il n'y a absolument aucune différence, dans toutes les versions de TFS, que ce soit en ligne de commande ou dans l'interface utilisateur.
Tous deux préservent l'histoire. Au moins en 2005/2008, vous conservez le même élément physique dans la table VersionedItem, quelle que soit la fréquence ou l'ampleur des changements de nom et/ou de chemin parent. Il n'y a en fait aucun moyen d'obtenir un "faux" renommage (supprimer + ajouter) sans un travail manuel important de votre part.
Toutefois, si ce modèle de versionnement est très pur d'un point de vue théorique, il présente quelques inconvénients pratiques. Parce que différents éléments peuvent occuper le même nom à différents moments, TFS a besoin du nom complet + la version pour identifier de manière unique toutes les entrées que vous lui envoyez. Normalement, vous ne remarquez pas cette restriction, mais une fois que vous avez renommé des éléments dans le système, si vous dites tf [doSomething] $/newname -version:oldversion alors il sera confus et lancera une erreur ou opérera sur un élément que vous n'avez peut-être pas prévu. Vous devez faire attention à passer des combinaisons valides (nouveau nom+nouvelle version ou ancien nom+ancienne version) pour vous assurer que les commandes se comportent comme vous le souhaitez.
TFS 2010 change quelque peu l'histoire : il s'agit d'une branche+suppression sous la couverture, ce qui entraîne un changement de l'itemID. Malgré cela, les commandes quotidiennes comme Get et History sont très bien "simulées" ; les anciens clients sont compatibles à 95%. L'avantage est que lorsque vous avez plusieurs renommages dans le système et que les recherches d'éléments basées sur le chemin d'accès commencent à devenir ambiguës comme indiqué ci-dessus, le serveur acceptera simplement le nom que vous spécifiez et fonctionnera avec. Cela améliore les performances globales du système et élimine plusieurs pièges dans lesquels les utilisateurs peu familiers tombaient souvent, au prix de ne pas être aussi flexible et de ne pas préserver l'historique avec une précision de 100% (par exemple lorsqu'il y a des collisions de noms pendant une fusion de deux branches).
Pour en revenir au problème qui nous occupe...
Ce n'est pas aussi simple que de dire tf renommer $/projetA $/projetB . Les dossiers de niveau supérieur dans l'arbre de contrôle de la source sont réservés à l'assistant de création de projet d'équipe ; vous ne pouvez pas exécuter les commandes tf standard contre eux. Ce dont vous avez besoin est un script comme :
Get-TfsChildItem $/ProjectA |
select -Skip 1 | # skip the root dir
foreach {
tf rename $_.serveritem $_.serveritem.replace("$/ProjectA", "$/ProjectB")
}
[bien sûr, vous pouvez le faire à la main s'il n'y a pas trop d'enfants sous $/ProjetA].
En ce qui concerne les écueils que j'ai mentionnés, je vais m'étendre sur l'un d'entre eux puisque la recherche de l'histoire ancienne semble très importante pour vous. Une fois que vous avez vérifié le changement de nom, tf historique $/ProjectA/somefile.cs ne fonctionnera PAS. Par défaut, les commandes tf supposent que la version = "latest". N'importe laquelle de ces alternatives vous donnera l'historique complet que vous voulez :
-
tf history $/ProjectA/somefile.cs;1234 où le changeset 1234 était avant le déplacement
-
tf history $/ProjectB/somefile.cs;5678 où le changeset 5678 était après le déplacement. Ou vous pouvez simplement omettre la version.
Une dernière alternative pour des raisons d'exhaustivité et de débogage :
-
tf history $/ProjectA/somefile.cs -slotmode . Vous ne verrez que les changements qui ont eu lieu avant le déplacement ; cependant, vous verrez également l'historique de tous les autres éléments qui ont pu vivre dans le "slot" $/ProjectA/somefile.cs avant ou après l'élément que vous avez déplacé sous B.
(Dans TFS 2010, le "mode slot" est le comportement par défaut ; il y a une option -ItemMode pour demander que votre recherche soit tracée dans l'historique comme en 2008 plutôt que basée sur le chemin).
EDIT - non, le branchement n'est pas une bonne alternative. Bien que le branchement laisse suffisamment de métadonnées dans le système pour retracer l'historique complet vers et depuis le Projet B, il n'est pas terriblement convivial en 2008. Prévoyez de passer beaucoup de temps à apprendre le tf fusionne (sans équivalent dans l'interface utilisateur). 2010 améliore considérablement votre capacité à visualiser les changements sur plusieurs branches, mais ce n'est toujours pas l'expérience unifiée et propre que vous obtiendriez avec un Renommer.