我有兴趣在命令提示符下获取shelveset的内容。现在,您会认为TFS Power Tools中提供的诸如Get-TfsShelveset之类的cmdlet可以执行此操作。您可能还认为“tf.exe shelvesets”会这样做。
然而,除非我错过了什么,否则我很震惊地报告说这两种情况都不是。相反,每个命令都要求你给它一个搁置集名称,然后简单地为该搁置集重新排序一个行项目,以及有关搁置集的一些元数据,如creationdate,displayname等。但据我所知,没办法告诉货架上的实际情况。
这对Get-TfsShelveset尤其令人发指,它能够包含一个文件描述符数组以及它返回的Shelveset对象。我甚至试图变得聪明,以为我可以通过使用-WhatIf和Restore-TfsShelveset来收集文件名,但遗憾的是Restore-TfsShelveset没有实现-WhatIf。
请有人告诉我,我错了!
答案 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