8 votes

Est-il possible de déplacer des dossiers d'un ensemble de branches TFS vers un autre et de conserver les modifications en attente ?

Actuellement, notre projet TFS (TFVC, non git) contient un dossier qui héberge l'intégralité de notre produit. Ce dossier contient trois branches (Dev, Main et Release) chacune contenant à leur tour de nombreux sous-projets différents. Nous essayons de restructurer de manière à ce que les composants distincts soient contenus dans leur propre structure de branches.

Question : Est-il possible de déplacer un dossier contenu sous une branche (pas la branche elle-même), ainsi que son dossier correspondant dans les autres branches, dans un nouveau projet TFS tout en maintenant la relation et le statut des changesets non fusionnés ?

Voici un schéma de notre résultat final souhaité :

structure cible

Nous souhaitons déplacer chacun des "Project 1" dossiers (côté gauche) dans leur propre structure de branches (côté droit), mais nous avons besoin que les changesets non fusionnés "suivent". Autrement dit, si nous tentons de fusionner de Dev vers Main dans la nouvelle structure, nous devons voir une liste des changesets (pertinents) qui n'ont pas été fusionnés dans l'ancienne structure.

Est-ce possible ? Si oui, quelle série de commandes tf/tfvc aurions-nous besoin d'exécuter pour y parvenir ? J'ai fait des recherches approfondies sur Google, mais je n'ai rien trouvé - soit parce que je ne sais pas comment décrire cela de manière efficace pour la recherche, soit parce que c'est tout simplement impossible.

Ce que j'ai essayé :

  • Déplacer/Renommer directement chacun des dossiers dans le nouveau projet (en pré-créant chacune des branches cibles Dev/Main/Release)

    • Les changesets non fusionnés ont été perdus.
    • Tout ce que j'obtiens est un seul changeset de "déplacement/renom" qui apparaît dans la liste des non fusionnés pour les nouvelles branches. Fusionner celui-ci provoque l'écrasement de tout dans la branche cible (c'est-à-dire que les fichiers de la branche Release sont désormais identiques à ceux de Dev).
    • Le bon côté, les shelvesets en attente "suivent automatiquement" lorsqu'ils sont retirés.
  • Brancher chaque dossier dans la nouvelle structure (cette fois sans pré-créer les dossiers des branches cibles)

    • Cela a créé trois branches qui n'étaient pas liées entre elles.
    • J'ai pu résoudre cela en faisant une fusion sans base entre elles (tf merge /baseless /recursive) et en prenant les fichiers de la branche cible en cas de conflit ; suivi de la reparentation des branches. (Comme expliqué ici)
    • Contrairement à ce qui précède, les fichiers eux-mêmes étaient corrects (rien n'a été écrasé).
    • Les changesets non fusionnés ont été perdus.
    • Les shelvesets sont déshelvés à l'emplacement original

Si cela est important, nous sommes prêts à perdre l'historique global si c'est la seule façon de résoudre ce problème. Idéalement, nous aimerions le conserver, même si cela signifiait stocker une copie "déconseillée" de l'original quelque part. Je ne suis pas tellement préoccupé par le fait que les shelvesets "suivent" leur source... nous en avons seulement deux qui seraient affectés et nous pouvons les gérer manuellement si nécessaire. Nous utilisons TFS 2018 en local.

Édition : en réponse à une réponse qui a été postée puis supprimée :

Je ne cherche pas à déplacer les branches, mais à extraire des dossiers profondément à l'intérieur d'eux dans leur propre structure de branches correspondante sans perdre les changements en attente. Je montre seulement deux niveaux ci-dessus, mais en réalité, ils sont beaucoup plus profonds. Je suis capable de tf rename une branche entière dans un bac à sable et d'obtenir les résultats attendus... mais renommer des branches n'est pas ce que j'essaie de faire, et déplacer les dossiers donne des résultats inattendus.

1voto

Jansen McEntee Points 171

Il semble que vous puissiez atteindre ce que vous voulez en ayant des relations de fusion à la fois des nouvelles branches Dev, Main, Release et des anciens dossiers de projet. Je pense que vous pouvez faire une variante de la deuxième "route" que vous avez essayée ci-dessus.

  1. Créez une branche du dossier du projet[x] de la vieille Release dans la branche de la nouvelle Project[x] > Release
  2. Créez une branche de la branche de la nouvelle Project[x] > Release dans la branche de la nouvelle Project[x] > Main
  3. Fusionnez (sans base) le dossier du projet[x] de la vieille Main (en spécifiant le changeset à partir duquel la vieille Release a été créée) dans la branche de la nouvelle Project[x] > Main
  4. Créez une branche de la branche de la nouvelle Project[x] > Main dans la branche de la nouvelle Project[x] > Dev
  5. Fusionnez (sans base) le dossier du projet[x] de la vieille Dev (en spécifiant le changeset à partir duquel la vieille Main a été créée) dans la branche de la nouvelle Project[x] > Dev
  6. Répétez pour les autres Projets

Le but est de créer les nouvelles relations de fusion de branche (en branchant [nouvelle] Release vers [nouvelle] Main puis [nouvelle] Main vers [nouvelle] Dev. À ce stade, la relation de fusion est établie et toutes les branches sont dans le même état. Ensuite, nous fusionnons sans base le [ancien] avec le [nouveau] pour Main et Dev. Pour Main, nous voulons faire la fusion sans base à l'état où Main et Release sont identiques (dans l'ancien). Pour Dev, nous voulons faire la fusion sans base à l'état où Dev et Main sont identiques (dans l'ancien). Ensuite, d'autres fusions peuvent se produire de [ancien] vers [nouveau] et celles-ci devraient être détectées comme des changements fusionnables de [nouveau] vers [nouveau] de manière similaire à celle de [ancien] vers [ancien]

Vous perdrez les ensembles de mises en réserve (mais vous pouvez toujours les retirer dans l'ancien emplacement, les valider et les fusionner dans le nouveau) mais l'historique devrait être conservé tant que le vieux projet n'est pas détruit.

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