2012-02-22 6 views
4

Dans le cadre d'une implémentation plus importante, j'essaie d'implémenter une opération de fusion de mes branches/dossiers de contrôle source à l'aide de TFS-SDK. Je travaille contre une installation TFS2010.
Ce que j'est le suivant:
TFS-SDK: la fusion ne fonctionne pas

using System; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.VersionControl.Client; 
using Microsoft.TeamFoundation.VersionControl.Common; 

namespace MergeBranchesFolders 
{ 
    class Program 
    { 
     static void Main() 
     { 
      TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://TFSSERVER/Collection")); 
      var versionControl = teamProjectCollection.GetService<VersionControlServer>(); 

      const string fromPath = "$/TeamProject/SourceDir"; 
      const string toPath = "$/TeamProject/TargetDir"; 

      Workspace myWorkspace = versionControl.GetWorkspace("WorkspaceName", "WorkspaceOwner"); 
      GetStatus getStatus = myWorkspace.Merge(fromPath, toPath, VersionSpec.Latest, VersionSpec.Latest, 
                LockLevel.None, RecursionType.Full, MergeOptionsEx.None); 
     } 
    } 
} 

Je suis convaincu que je reçois un accès adéquat à myWorkspace, mais le getStatus ressemble à ceci:

enter image description here
Cela dit à peu près que rien est arrivé.

Pourtant, si j'essaie de fusionner dans l'EDI, j'obtiens plusieurs candidats de fusion.
Les mêmes candidats de fusion sont également visibles si je fais:

var mergeCandidates = versionControl.GetMergeCandidates(fromPath, toPath,RecursionType.Full).ToList(); 

J'échoué avec les deux fromPath/toPath étant des branches et des dossiers - même avec une seule file.
La seule ressource là-bas je pourrais trouver était this un, qui n'a pas aidé ...

Répondre

5

Shai Raiten blog-post à la rescousse!

Cette tentative échoua:

GetStatus getStatus = myWorkspace.Merge(fromPath, toPath, VersionSpec.Latest, VersionSpec.Latest, 
                LockLevel.None, RecursionType.Full, MergeOptionsEx.None); 

Cette réussi:

GetStatus getStatus = myWorkspace.Merge(fromPath, toPath, null, null, LockLevel.None, RecursionType.Full, MergeOptionsEx.None); 
4

Alors que le lien vers le blog de Shai Raiten avéré être utile, la raison de ce changement n'a pas été très clair dans la réponse ci-dessus, et il n'a pas été très clair dans le blog de Shai (ou dans Microsoft's documentation d'ailleurs). La clé ici est au sens de fromVersion et toVersion. Il semble que l'auteur de cette question ait fait la même erreur que moi, en mal compris la signification de ces paramètres. Dans mon cas, j'ai compris que "from" et "to" étaient des références à la source (point de départ) et à la cible (point final) de la fusion, respectivement. Bien que je ne comprenais pas pourquoi on devrait spécifier la version «à» dans ce cas, puisque pour réellement faire une fusion significative, la version de la cible toujours doit être le Conseil. Donc, en lisant la description du paramètre en tant que versions «débutant» et «finissant», je ne me suis pas trouvé en contradiction avec cette interprétation.

Ce que je suis finalement arrivé à comprendre est que, dans ce cas, le « de » et « à » sont deux référence à la sourcede la fusion, où « de » fait référence au point de départ pour une gamme de changesets, et "to" fait référence au point se terminant pour une gamme de changesets. Si vous omettez le paramètre "fromVersion", vous indiquez que vous voulez inclure tous les changesets au début (ou à la dernière fusion enregistrée), sinon vous dites que vous voulez seulement inclure les changesets qui remontent aussi loin que le version spécifiée. Si vous omettez le "toVersion" alors vous dites que vous voulez inclure tous les changesets jusqu'à la version Tip, sinon vous dites que vous voulez inclure des changesets seulement jusqu'à la version spécifiée. Ainsi, dans le code d'origine avec les paramètres fromVersion et toVersion spécifiés comme VersionSpec.Latest, vous dites que vous voulez fusionner tous les changesets intervenant entre la dernière version et la dernière version, qui par définition ne contient aucune modification. Dans le code modifié, cependant, avec null spécifié pour les deux paramètres, vous incluez tous les changesets disponibles sans contraintes.

Questions connexes