Visual studio 以编程方式访问TFS注释以确定所有者

Visual studio 以编程方式访问TFS注释以确定所有者,visual-studio,tfs,Visual Studio,Tfs,我在一个项目团队工作,我们的应用程序在TFS中。我试图确定每个团队成员负责多少行代码。在TFS中,我注意到VisualStudio界面中的注释功能,它允许您查看最后修改每行代码的人,因此我知道TFS具有此信息 我已经编写了一个小的控制台应用程序,它可以访问我的TFS项目及其所有文件,但现在我需要通过编程访问注释,以便查看每一行的所有者。以下是我现有的代码: using Microsoft.TeamFoundation.Client; using Microsoft.TeamFoundation.

我在一个项目团队工作,我们的应用程序在TFS中。我试图确定每个团队成员负责多少行代码。在TFS中,我注意到VisualStudio界面中的注释功能,它允许您查看最后修改每行代码的人,因此我知道TFS具有此信息

我已经编写了一个小的控制台应用程序,它可以访问我的TFS项目及其所有文件,但现在我需要通过编程访问注释,以便查看每一行的所有者。以下是我现有的代码:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

public class Program
{
    static void Main(string[] args)
    {
        var credentials = new NetworkCredential(username, password, domain);
        var server = new TfsTeamProjectCollection(new Uri(serverUrl), credentials);
        var version = server.GetService(typeof(VersionControlServer)) as VersionControlServer;
        var items = version.GetItems(projectPath, RecursionType.Full);
        var fileItems = items.Items.Where(x => x.ItemType == ItemType.File);            
        foreach (var fileItem in fileItems)
        {
            var serverItem = fileItem.ServerItem;
            //TODO: retrieve and parse annotations
        }
    }
}
一旦我有了TFS项,我似乎不知道如何检索注释。link解释了如何通过调用TFPT来实现它,但是在实现它之后(
TFPT annotate/noprompt
),您只需要给出每行的最后一个变更集和代码,而不是所有者

我还发现了一个名称空间,它有一个
注释
类。我在我的机器上安装了TFS以访问该DLL,但它似乎对这个问题没有任何帮助


如何以编程方式访问TFS注释以确定文件代码行的所有者?

当项目的更改类型为branch时,可能需要查询分支。 举个简单的例子,这里有一个场景

$/Project
  /Main`
   /a.txt
  /Develop
   /a.txt (branched from main)
查询$/project/develope/a.txt的历史记录时,还可以使用以下代码获取$/project/Main/a.txt的历史记录

void GetAllHistory(string serverItem)
    {                    
        var changesets=vcs.QueryHistory(serverItem,
            Microsoft.TeamFoundation.VersionControl.Client.VersionSpec.Latest,
            0,
             Microsoft.TeamFoundation.VersionControl.Client.RecursionType.None,
             null,
             new Microsoft.TeamFoundation.VersionControl.Client.ChangesetVersionSpec(1),
              Microsoft.TeamFoundation.VersionControl.Client.VersionSpec.Latest,
              int.MaxValue,
              true,
              false);

        foreach (var obj in changesets)
        {
            Microsoft.TeamFoundation.VersionControl.Client.Changeset cs = obj as Microsoft.TeamFoundation.VersionControl.Client.Changeset;
            if (cs == null)
            {
                return;
            }
            foreach (var change in cs.Changes)
            {
                if (change.Item.ServerItem != serverItem)
                {
                    return;
                }

                Console.WriteLine(string.Format("ChangeSetID:{0}\tFile:{1}\tChangeType:{2}", cs.ChangesetId,change.Item.ServerItem, change.ChangeType));
                if ((change.ChangeType & Microsoft.TeamFoundation.VersionControl.Client.ChangeType.Branch) == Microsoft.TeamFoundation.VersionControl.Client.ChangeType.Branch)
                {
                    var items=vcs.GetBranchHistory(new Microsoft.TeamFoundation.VersionControl.Client.ItemSpec[]{new Microsoft.TeamFoundation.VersionControl.Client.ItemSpec(serverItem, Microsoft.TeamFoundation.VersionControl.Client.RecursionType.None)},
                        Microsoft.TeamFoundation.VersionControl.Client.VersionSpec.Latest);

                    GetAllHistory(items[0][0].Relative.BranchToItem.ServerItem);
                }
            }

        }
    }

@主持人:哈。我刚刚更新了我的问题,正如你所评论的。这个答案并不是真正的答案……你能解释一下它为什么没有帮助吗?如果这是真的,那么就没有内置的方法,也没有工具(请注意,直接要求工具是离题的)。但是,您可以使用TFS API编写一个小程序来实现此目的。@CodeMaster:我想真正的问题是似乎完全没有TFS版本控制库的文档。在这段代码中,我看不到哪里可以找到每行代码的所有者。我实现了它,我能看到的唯一所有者是变更集的所有者(
obj.owner
)。我为您找到了一个在线项目,该项目解释了如何通过TFS API获取注释。实际上,它使用的是与上面介绍的相同的东西—从GetBranchHistory()结果中获取项[0][0]的递归数据。然而,这些暗示更为复杂。如果许可证没有问题,您可能希望将该GitHub模块包括到您的项目中。感谢您将我链接到完整的项目。这是相当复杂的,但是我能够使用repo中的一些类来注释每行的文件!我接受你的回答,但是当我有时间的时候,我会发布我完整的代码和我所需要的一切。再次感谢!酷。很高兴听到问题解决了。我还了解到annotation的功能超出了我的想象,这可能就是MS不为其公开API的原因。