从TFS中的VersionSpec合并:VersionSpec.Latest无法按预期工作

时间:2014-03-25 14:44:41

标签: version-control tfs tfs-sdk

我在TFS中创建了一个实用程序,用于枚举从源分支到目标分支的更改和冲突。我想为源分支选择包含VersionSpec。但是,当我提供如下所示的默认VersionSpec时,我得不到预期的结果。我已经使用GUI进行合并,它显示了19个没有冲突的变化。但是在TFS API中它告诉我,如果我使用VersionSpec,则没有任何变化。

VersionSpec spec = VersionSpec.ParseSingleSpec("T", null)
mergeStatus = workspace.Merge(ServerSourcePath, ServerTargetPath, spec, null, LockLevel.None, RecursionType.Full, MergeOptions.None);
//mergeStatus.noActionNeeded returns TRUE

//OK now try another method
spec = VersionSpec.Latest
mergeStatus = workspace.Merge(ServerSourcePath, ServerTargetPath, spec, null, LockLevel.None, RecursionType.Full, MergeOptions.None);
//mergeStatus.noActionNeeded returns TRUE again

//But if I try using null instead of a VersionSpec....
mergeStatus = workspace.Merge(ServerSourcePath, ServerTargetPath, null, null, LockLevel.None, RecursionType.Full, MergeOptions.None);
//mergeStatus.noActionNeeded returns FALSE, and I am able to see all 19 changes

那么为什么null在这里正常工作,但其他两种方法不正常?虽然我打算在这种情况下使用null,但是另一种方法缺乏可靠性使我怀疑我不相信任何VersionSpec的结果,例如LabelVersionSpec。我相信在使用LabelVersionSpec进行测试时,我可能已经看到了一些可疑结果,因此我需要了解是否存在需要考虑的差异的原因。

1 个答案:

答案 0 :(得分:1)

由于微软通常缺乏全面的文档,我误解了fromVersiontoVersion参数,意思是sourceVersiontargetVersion(合并"来自& #34;一个分支"到#34;另一个分支),虽然我确实想知道在目标分支中有VersionSpec的用例是什么,因为你总是会申请它提示。事实证明,fromVersiontoVersion似乎可以选择更改集的子集,因此在上面的代码中,VersionSpec spec变量应该在{toVersion中使用1}}参数,而不是fromVersionfromVersion = null意味着合并应该返回到分支中的初始变更集(或者最后记录的合并,可能),而toVersion = null意味着合并应该使用一切到Tip / most最近的变化。

更新的代码:

VersionSpec spec = VersionSpec.ParseSingleSpec("T", null)
mergeStatus = workspace.Merge(ServerSourcePath, ServerTargetPath, null, spec, LockLevel.None, RecursionType.Full, MergeOptions.None);
//mergeStatus.noActionNeeded returns FALSE

//OK now try another method
spec = VersionSpec.Latest
mergeStatus = workspace.Merge(ServerSourcePath, ServerTargetPath, null, spec, LockLevel.None, RecursionType.Full, MergeOptions.None);
//mergeStatus.noActionNeeded returns FALSE again

//And if I try using null instead of a VersionSpec....
mergeStatus = workspace.Merge(ServerSourcePath, ServerTargetPath, null, null, LockLevel.None, RecursionType.Full, MergeOptions.None);
//mergeStatus.noActionNeeded returns FALSE