在命令提示符下获取Tfs Shelveset文件内容?

时间:2011-07-01 22:39:26

标签: command-line powershell tfs tfs2010 shelveset

我有兴趣在命令提示符下获取shelveset的内容。现在,您会认为TFS Power Tools中提供的诸如Get-TfsShelveset之类的cmdlet可以执行此操作。您可能还认为“tf.exe shelvesets”会这样做。

然而,除非我错过了什么,否则我很震惊地报告说这两种情况都不是。相反,每个命令都要求你给它一个搁置集名称,然后简单地为该搁置集重新排序一个行项目,以及有关搁置集的一些元数据,如creationdate,displayname等。但据我所知,没办法告诉货架上的实际情况。

这对Get-TfsShelveset尤其令人发指,它能够包含一个文件描述符数组以及它返回的Shelveset对象。我甚至试图变得聪明,以为我可以通过使用-WhatIf和Restore-TfsShelveset来收集文件名,但遗憾的是Restore-TfsShelveset没有实现-WhatIf。

请有人告诉我,我错了!

6 个答案:

答案 0 :(得分:11)

tf status /shelveset:name

将列出指定shelveset的内容(您也可以向所有者提供商:请参阅tf help status)。

使用TFS PowerToy的PowerShell管理单元:

Get-TfsPendingChange -Shelveset name

获取相同的信息。

答案 1 :(得分:5)

可以构建一个使用TFS SDK的小型命令行应用程序,该应用程序返回给定shelveset中包含的文件列表。
下面的示例假设知道Shelveset名称&它的主人:

using System;
using System.IO;
using System.Collections.ObjectModel;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace ShelvesetDetails
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri tfsUri = (args.Length < 1) ? new Uri("TFS_URI") : new Uri(args[0]);

            TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);

            ReadOnlyCollection<CatalogNode> collectionNodes = configurationServer.CatalogNode.QueryChildren(
                new[] { CatalogResourceTypes.ProjectCollection },
                false, CatalogQueryOptions.None);

            CatalogNode collectionNode = collectionNodes[0];

            Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
            TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);

            var vcServer = teamProjectCollection.GetService<VersionControlServer>();

            Shelveset[] shelves = vcServer.QueryShelvesets(
                "SHELVESET_NAME", "SHELVESET_OWNER");
            Shelveset shelveset = shelves[0];

            PendingSet[] sets = vcServer.QueryShelvedChanges(shelveset);
            foreach (PendingSet set in sets)
            {
                PendingChange[] changes = set.PendingChanges;
                foreach (PendingChange change in changes)
                {
                    Console.WriteLine(change.FileName);
                }
            }
        }
    }
}

调用此控制台应用&amp;应该可以在执行powershell期间捕获结果。

答案 2 :(得分:3)

尝试:

  

tfpt评论   /搁置:shelvesetName;用户名

您可能还需要添加服务器选项,例如:

  

tfpt review / shelveset:Code Review; jim   /服务器:公司源

我认为这就是你要找的东西。

答案 3 :(得分:2)

这是我最终得到的,基于pentelif的代码和我在评论中链接的http://akutz.wordpress.com/2010/11/03/get-msi/文章中的技术。

function Get-TfsShelvesetItems
{
    [CmdletBinding()]
    param
    (
        [string] $ShelvesetName = $(throw "-ShelvesetName must be specified."),
        [string] $ShelvesetOwner = "$env:USERDOMAIN\$env:USERNAME",
        [string] $ServerUri = $(throw "-ServerUri must be specified."),
        [string] $Collection = $(throw "-Collection must be specified.")
    )

    $getShelvesetItemsClassDefinition = @'
    public IEnumerable<PendingChange> GetShelvesetItems(string shelvesetName, string shelvesetOwner, string tfsUriString, string tfsCollectionName)
    {
        Uri tfsUri = new Uri(tfsUriString);
        TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
        ReadOnlyCollection<CatalogNode> collectionNodes = configurationServer.CatalogNode.QueryChildren( new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);
        CatalogNode collectionNode = collectionNodes.Where(node => node.Resource.DisplayName == tfsCollectionName).SingleOrDefault();
        Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
        TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
        var vcServer = teamProjectCollection.GetService<VersionControlServer>();
        var changes = new List<PendingChange>();
        foreach (Shelveset shelveset in vcServer.QueryShelvesets(shelvesetName, shelvesetOwner))
        {
            foreach (PendingSet set in vcServer.QueryShelvedChanges(shelveset))
            {
                foreach ( PendingChange change in set.PendingChanges )
                {
                    changes.Add(change);
                }
            }
        }
        return changes.Count == 0 ? null : changes;
    }
'@;

    $getShelvesetItemsType = Add-Type `
        -MemberDefinition $getShelvesetItemsClassDefinition `
        -Name "ShelvesetItemsAPI" `
        -Namespace "PowerShellTfs" `
        -Language CSharpVersion3 `
        -UsingNamespace System.IO, `
                        System.Linq, `
                        System.Collections.ObjectModel, `
                        System.Collections.Generic, `
                        Microsoft.TeamFoundation.Client, `
                        Microsoft.TeamFoundation.Framework.Client, `
                        Microsoft.TeamFoundation.Framework.Common, `
                        Microsoft.TeamFoundation.VersionControl.Client `
        -ReferencedAssemblies "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Client.dll", `
                                "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Common.dll", `
                                "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Client.dll" `
        -PassThru;

    # Initialize an instance of the class.
    $getShelvesetItems = New-Object -TypeName "PowerShellTfs.ShelvesetItemsAPI";

    # Emit the pending changes to the pipeline.
    $getShelvesetItems.GetShelvesetItems($ShelvesetName, $ShelvesetOwner, $ServerUri, $Collection);
}

答案 4 :(得分:1)

花了几天尝试这样做,这总是出现在谷歌上所以这是我发现的帮助后代:

要获取shelveset的内容(至少使用Team Explorer Everywhere),
使用命令:tf difference /shelveset:<Shelveset name>

这将打印出shelveset的内容并以以下形式提供文件名:
<Changetype>: <server file path>; C<base change number>
Shelved Change: <server file path again>;<shelveset name>

因此,如果您的文件是contents/test.txt 在shelveset shelve1(基础修订版1)中,您将看到:
edit: $/contents/file.txt;C1
Shelved Change: $/contents/file.txt;shelve1

之后,使用tf print命令
(或查看,如果不使用TEE)$/contents/file.txt;shelve1应该为您提供内容:

tf print $/contents/file.txt;shelve1

显示shelveset file.txt

shelve1的内容

答案 5 :(得分:0)

如果要使用tfs命令从服务器获取架子集更改

使用电源外壳:

Get-TfsPendingChange-服务器http://example.com/org -Shelveset shelvsetName

使用vs命令:

c:\ projects> tf架子集BuddyTest_23

有关此的更多信息,请参见此处 https://docs.microsoft.com/en-us/azure/devops/repos/tfvc/shelvesets-command?view=azure-devops