查询TFS数据库以获取最近10个签入详细信息

时间:2010-01-08 17:26:25

标签: sql sql-server tfs

有没有办法查询TFS数据库以获取最后10个签到详细信息

输出应该是

File name    |      Comment              |   Changed By     |     Date
----------------------------------------------------------------------------
Test.cs         Added new functionality       username           01/08/2010

我知道可以使用TFS SDK获得上述结果集。但我想知道是否 有一种方法可以查询TFS数据库以获取上述数据。

由于

4 个答案:

答案 0 :(得分:8)

如果我正确地理解了你的问题,那么这将使你在SQL中获得大部分内容:

SELECT TOP 10
V.ChildItem AS [File name],
CS.Comment,
I.DisplayName AS [Changed By],
CS.CreationDate AS [Date]
FROM tbl_Changeset CS
INNER JOIN tbl_Identity I ON I.IdentityID = CS.OwnerID
INNER JOIN tbl_Version V ON V.VersionFrom = CS.ChangesetID
ORDER BY CS.CreationDate DESC

在我的TFS实例上测试时,文件名中出现了一些转义字符(如下划线字符变为“>”)。除此之外,这应该对你有用。

答案 1 :(得分:5)

许多这些查询不再与较新的TFS实例相关。其中一个重要原因是用户身份(tbl_Identity)已被移动。 Tfs_DefaultCollection是存储与给定Collection相关的所有信息的数据库,但TFS可以托管多个集合 AND ,管理员可以在设置TFS时更改默认集合的名称。

因此,所有用户身份都已移至Tfs_Configuration数据库;

select * from [tfs_Configuration].dbo.tbl_Identity

通过从[tfs_DefaultCollection] .dbo.tbl_IdentityMap

加入来获取从集合数据库访问帐户名称(AccountName或DisplayName)的描述性部分
select *
from [tfs_Configuration].dbo.tbl_Identity I
JOIN [tfs_DefaultCollection].dbo.tbl_IdentityMap IM
    ON I.Id = IM.MasterID

掌握了这些信息后,我们现在可以生成以下查询,以显示提交给TFS的最后100个ChangeSet以及提交者的名称。

select top 100 *
from tbl_changeset as c
JOIN tbl_IdentityMap IM
    ON C.OwnerID = IM.localId
JOIN tfs_configuration.dbo.tbl_Identity u
    ON IM.MasterID = u.Id
Order by C.ChangeSetID DESC

查看这些数据,我们可以看到很多ID,Sids,Lookup等。我们在此数据中看不到的是有关已提交的文件或有关提交分支的信息的任何信息。此信息来自 tbl_Version 表。

select top 100 *
from [tfs_DefaultCollection].dbo.tbl_changeset as c
JOIN [tfs_DefaultCollection].dbo.tbl_IdentityMap IM
    ON C.OwnerID = IM.localId
JOIN [tfs_configuration].dbo.tbl_Identity u
    ON IM.MasterID = u.Id
JOIN [tfs_DefaultCollection].dbo.tbl_Version as v
    ON v.Versionfrom = c.ChangeSetId
Order by C.ChangeSetID DESC

[tfs_DefaultCollection] .dbo.tbl_Version有几个感兴趣的列,即; ParentPath,ChildItem&完整路径。这里缺少的是有关提交提交的分支的任何有用信息。分支信息嵌入在2个可用路径字段之一中;

$\da3da7cf"80b5"4385"b3dc"ebb3088f3c01\Features\Inpatient\Source\Yadda\Yadda\Yadda\

这引出了下一个问题,分支信息存储在TFS中?感谢上面的StackOverflowUsers回答,此信息可在[tfs_DefaultCollection] .dbo.TreeNodes表中找到;

select * from [tfs_DefaultCollection].dbo.[TreeNodes] where parentID=0 and fDeleted=0

列CssNodeID是我们想要从FullPath

中理解的ID
CoolBranchName  da3da7cf-80b5-4385-b3dc-ebb3088f3c01

但是,这为我们提供了有关TFS数据库的下一个挑战。许多信息都是编码和/或嵌入的,因此我们需要操纵一些东西来获得我们所追求的东西。

在此实例中,包含分支信息的[tfs_DefaultCollection] .dbo.tbl_Version.ParentPath或[tfs_DefaultCollection] .dbo.tbl_Version.FullPath值的一部分。

这个丑陋的小伙伴就在这里提取ParentPath字段值的ID部分,并用连字符替换所有双引号,它给我们一个Id值,我们可以用来查询[Tfs_DefaultCollection] .dbo.TreeNodes

SUBSTRING(
    REPLACE( v.ParentPath, '$\', ''),
    CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') ),
    ( LEN( v.ParentPath ) - CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') ) )
)

将所有这些放在一起追求查询以获取最后[X]登记详细信息的结果如下:

select top 10
    c.CreationDate,
    c.Comment,
    u.DisplayName as CommittingUser,
    TN.Name as BranchName,
    SUBSTRING(
        REPLACE( v.ParentPath, '$\', ''),
        CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') ),
        ( LEN( v.ParentPath ) - CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') ) )
    ) as ChangedFile
from tbl_changeset as c
JOIN tbl_IdentityMap IM
    ON C.OwnerID = IM.localId
JOIN [Tfs_Configuration].dbo.tbl_Identity u
    ON IM.MasterID = u.Id
JOIN dbo.tbl_Version as v
    ON v.Versionfrom = c.ChangeSetId
LEFT JOIN dbo.TreeNodes TN with(nolock)
    ON TN.CssNodeId = REPLACE(
        SUBSTRING(
            REPLACE( v.ParentPath, '$\', ''),
            0,
            CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') )
        ),
        '"', '-'
    )
    AND parentID=0
    AND fDeleted=0
Order by c.CreationDate desc

请注意,我为所有查询提供了数据库限定符,以便提供最终查询,以提供感兴趣的表所在位置的上下文。

答案 2 :(得分:1)

作为一种解决方法如何进行下面的查询..但我认为它回复了我错误的评论..不确定原因。

SELECT top 10
C.ChangeSetId, 
V.FullPath, 
V.ParentPath, 
REPLACE(V.ChildItem,'\','') as [FileName], 
C.CreationDate, 
I.DisplayName,
C.Comment
FROM tbl_Version(nolock) V
INNER JOIN tbl_File (nolock) F ON V.ItemId = F.ItemId
INNER JOIN tbl_Changeset (nolock) C ON V.VersionTo = C.ChangeSetId
INNER JOIN tbl_Identity (nolock) I ON C.CommitterId = I.IdentityId
where v.ParentPath like '$\' + (select name from [TfsWorkItemTracking].[dbo].[treenodes] where parentid=0 and fdeleted=0 and id=524) + '\%'
order by C.CreationDate desc

感谢mark.crockett发布上述查询@ http://social.msdn.microsoft.com/Forums/en-US/tfsreporting/thread/32d2c27e-825b-43bb-b156-36048a3e70cb/

答案 3 :(得分:0)

如果您有权访问托管TFS数据库的SQL服务器,那么您必须查看的数据库是TFSWarehouse,那么您可以查找工作项,tbl_Changeset,tbl_Identity,tbl_Version等表,从中可以获取一些信息。< / p>

Thnks。