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

问题描述 投票:7回答:6

我有兴趣在命令提示符下获取架子集的内容。现在,您会认为TFS Power Tools中提供的cmdlet(例如Get-TfsShelveset)可以做到这一点。您可能还认为“ tf.exe架子集”可以做到这一点。

但是,除非我错过了任何事情,否则我很遗憾地报告这两种情况都不是。取而代之的是,每个命令都要求您为其指定一个架子集名称,然后简单地为该架子集重新配置单个订单项以及有关架子集的一些元数据,例如creationdate,displayname等。但据我所知,这是没有办法的告诉货架上到底有什么。

这对于Get-TfsShelveset尤其令人发指,它具有包含文件描述符数组以及它返回的Shelveset对象的功能。我什至试图变得聪明一点,以为我可以通过在Restore-TfsShelveset中使用-WhatIf来收获文件名,但可悲的是Restore-TfsShelveset没有实现-WhatIf。

请,有人告诉我我错了!

command-line powershell tfs tfs2010 shelveset
6个回答
5
投票

可以构造一个使用TFS SDK的小型命令行应用程序,该应用程序将返回给定架子集中包含的文件列表。下面的示例假定您了解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);
                }
            }
        }
    }
}

应该可以在执行Powershell的过程中调用此控制台应用程序并捕获结果。


11
投票
tf status /shelveset:name

将列出命名的货架集的内容(您也可以提供所有者:请参见tf help status。]

使用TFS PowerToy的PowerShell管理单元:

Get-TfsPendingChange -Shelveset name

有关相同信息。


3
投票

尝试:

tfpt评论/ shelveset:shelvesetName; userName

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

tfpt评论/ shelveset:代码评论; jim/ sever:company-source

我认为这就是您想要的。


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

1
投票

也花了几天时间尝试这样做,这总是在Google上弹出,因此这是我发现对后代有帮助的内容:

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

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

因此,如果您的文件是contents/test.txt在货架集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

向您显示架子集file.txtshelve1中的内容


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

© www.soinside.com 2019 - 2024. All rights reserved.