2012-02-22 1 views
4

Как часть более крупной реализации, я пытаюсь реализовать операцию слияния своих ветвей/папок управления версиями с помощью TFS-SDK. Я работаю против установки TFS2010.
Что у меня есть это:
TFS-SDK: Merge не работает

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); 
     } 
    } 
} 

Я убежден, что я получаю надлежащий доступ к myWorkspace, однако getStatus выглядит следующим образом:

enter image description here
Это очень много говорит, что ничего не произошло.

Но если я попытаюсь объединиться в IDE, я получаю несколько кандидатов на слияние.
Те же кандидаты слияния также видны, если я делаю:

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

мне не удалось с обеих fromPath/toPath, являющихся филиалами и папками - даже с одним файлом.
Единственный ресурс, который я мог найти, был this один, который не помог ...

ответ

5

Shai Raiten's blog-post на помощь!

Это не удалось:

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

Это удалось:

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

Хотя ссылка на блог Шай Raiten оказалось, чтобы быть полезным, причиной изменения было не очень ясно в ответ выше, и это не было четко изложено в блоге Шая (или в Microsoft's documentation, если на то пошло). Ключевым здесь является значение fromVersion и toVersion. Похоже, что автор этого вопроса сделал ту же ошибку, что и я, недопонимая смысл этих параметров. В моем случае я понял, что «от» и «до» - ссылки на источник (начальную точку) и целевую (конечную точку) слияния, соответственно. Хотя я не понял, почему в этом случае нужно указывать версию «на», так как для фактического выполнения значимого слияния должна быть подсказка для цели всегда. Таким образом, чтение описания параметра в качестве «начальных» и «окончательных» версий не показало мне противоречия с этой интерпретацией.

То, что я, наконец, пришел, чтобы понять, что в данном случае «от» и «до» являются как со ссылкой на источник от слияния, где «от» относится к начиная точки для диапазон наборов изменений и «to» относится к , заканчивающемуся, для ряда наборов изменений. Если вы опустите параметр fromVersion, вы говорите, что хотите включить все изменения в начало (или последнее записанное слияние), иначе вы говорите, что хотите включить только набор изменений, идущий еще указанной версии. Если вы опустите «toVersion», то вы говорите, что хотите включить все изменения в версию Tip, иначе вы говорите, что хотите включать в себя изменения только до указанной версии.

Итак, в исходном коде с параметрами fromVersion и toVersion, указанными как VersionSpec.Latest, вы говорите, что хотите объединить все изменения, происходящие между последней версией и последней версией, которая по определению не содержит изменений. Однако в модифицированном коде с нулевым значением, указанным для обоих параметров, вы включаете все доступные изменения без ограничений.