7

我有兴趣在命令提示符下获取搁置集的内容。现在,您会认为 TFS Power Tools 中可用的 cmdlet(例如 Get-TfsShelveset)可以执行此操作。您可能还认为“tf.exe 搁置集”会这样做。

但是,除非我错过了什么,否则我很震惊地报告说这些都不是。相反,每个命令都要求您给它一个搁置集名称,然后简单地为该搁置集反刍一个行项目,以及有关搁置集的一些元数据,例如创建日期、显示名称等。但据我所知,没有办法告诉架子里到底有什么。

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

拜托,有人告诉我我错了!

4

6 回答 6

11
tf status /shelveset:name

将列出命名搁置集的内容(您也可以提供所有者:参见tf help status)。

使用 TFS PowerToy 的 PowerShell 管理单元:

Get-TfsPendingChange -Shelveset name

相同的信息。

于 2012-05-01T15:50:42.043 回答
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 期间调用此控制台应用程序并捕获结果。

于 2011-07-12T12:07:29.450 回答
3

尝试:

tfpt 审查/搁置集:搁置集名称;用户名

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

tfpt review /shelveset:代码审查;jim /sever:company-source

我想这就是你要找的。

于 2011-07-02T00:14:35.140 回答
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);
}
于 2011-07-19T17:43:45.610 回答
1

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

要获取搁置集的内容(至少使用 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.txt搁置集中的内容shelve1

于 2012-05-01T14:31:48.393 回答
0

如果您想使用 tfs 命令从服务器获取搁置集更改

使用电源外壳:

Get-TfsPendingChange -Server 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

于 2019-11-14T07:47:44.187 回答