如何在不创建工作区的情况下从tfs获取特定版本的文件夹?

Iva*_*anH 11 tfs command-line tfs-sdk tfs2010 visual-studio-macros

我想在特定时间(变更集)获取项目的源代码.所以我需要下载整个文件夹.我想在不同的时间做这件事并且处理不同的工作空间不是很方便.

我知道TFS获取特定版本到单独的文件夹(带工作空间)和Need命令从TFS获取文件而没有工作空间(一个文件).

没有创建新工作区,是否有整个文件夹的解决方案?

编辑 我发现接受的答案太雄心勃勃了.我需要更简单的东西.

假设:

  • 我可以在我的计算机上从Visual Studio访问TFS
  • 我想ChangeSetNumberDesiredFolderTFS项目中的文件夹中获取Changeset tProj

我从Visual Studio命令提示符中的目标文件夹运行以下批处理

set workspace_name=TemporaryWorkspace%username%
set changeset= ChangeSetNumber                
tf workspace -new %workspace_name% -noprompt
tf workfold -map $/tProj . -workspace:%workspace_name%
tf get $/tProj/DesiredFolder -version:C%changeset% -recursive -noprompt
tf workfold -unmap . -workspace:%workspace_name%
tf workspace -delete %workspace_name% -noprompt
Run Code Online (Sandbox Code Playgroud)

启动下载的解决方案时,必须确认删除源控制关联.

Dav*_*son 13

我将此语法用于临时工作空间:

tf workspace -new %JOB_NAME%;%user% -noprompt -server:http://%host%:8080/tfs/%project% -login:%user%,%password%
tf workfold -map $/Release/MilestoneX.X . -workspace:%JOB_NAME% -server:http://%host%:8080/tfs/%project% -login:%user%,%password%
tf get . -version:L%TFS_LABEL% -recursive -noprompt -login:%user%,%password%
tf workfold -unmap . -workspace:%JOB_NAME% -login:%user%,%password%
tf workspace -delete %JOB_NAME%;%user% -noprompt -server:http://%host%:8080/tfs/%project% -login:%user%,%password%
Run Code Online (Sandbox Code Playgroud)


Mar*_*lug 7

我发现你可以通过TFS公开的HTTP api来做到这一点.URL的"签名"如下:

http(s)://{server}:{port}/tfs/{collectionName}/{teamProjectName}/_api/_versioncontrol/itemContentZipped?version={versionSpec}&path={escapedPathToFolder}
Run Code Online (Sandbox Code Playgroud)

因此,如果您在DefaultCollection中有一个名为"MyProject"的项目,并且想要获取名为"MyFeature"的文件夹的内容:

http://MyTfsServer:8080/tfs/DefaultCollection/MyProject/_api/_versioncontrol/itemContentZipped?version=C1001&path=%24%2FMyProject%2FMyFeature
Run Code Online (Sandbox Code Playgroud)

我认为"版本"可以是任何版本规范,在TFS API文档中有记录.我的示例是请求更改集1001的版本.我使用.NET API来获取特定版本,这非常简单,但速度慢,因为它一次只能获取一个文件.我试图弄清楚是否通过.NET API公开了相同的功能,因为以这种方式下载文件要比一次获取单个文件快得多.

我实现了这个作为扩展方法on Microsoft.TeamFoundation.VersionControl.Client.Item.这将返回一个包含zip文件的流.我使用它作为自定义MSBuild任务的一部分,然后将该流的内容保存到文件位置.

public static class TfsExtensions
{

    const String ItemContentZippedFormat = "/_api/_versioncontrol/itemContentZipped?version={0}&path={1}&__v=3";

    public static Stream DownloadVersion(this Item folder, VersionSpec version)
    {
        if (folder.ItemType != ItemType.Folder)
            throw new ArgumentException("Item must be a folder", "folder");


        var vcs = folder.VersionControlServer;

        var collectionName = vcs.TeamProjectCollection.CatalogNode.Resource.DisplayName;

        var baseUri = folder.VersionControlServer.TeamFoundationServer.Uri;
        if (!baseUri.LocalPath.EndsWith(collectionName, StringComparison.OrdinalIgnoreCase))
            baseUri = new Uri(baseUri, baseUri.LocalPath + "/" + collectionName);


        var apiPath = String.Format(ItemContentZippedFormat, version.DisplayString, WebUtility.UrlEncode(folder.ServerItem));
        var downloadUri = new Uri(baseUri, baseUri.LocalPath + apiPath);

        var req = WebRequest.Create(downloadUri);
        req.Credentials = CredentialCache.DefaultCredentials;
        var response = req.GetResponse();
        return response.GetResponseStream();
    }
}
Run Code Online (Sandbox Code Playgroud)


Noc*_*ock 5

我认为您应该创建一个临时工作区来检索您想要的内容,然后删除工作区并保留本地项目。

TFS 中的工作区是服务器上内容的本地视图,对于给定的工作区,您可以选择要在本地检索的文件夹以及存储文件夹/文件的位置。

它不像 SourceSafe,您不仅限于一个工作区,您可以在给定的计算机上拥有任意数量的工作区。

所以我建议你为你想做的操作创建一个专用的工作区,并在你认为合适的时候摆脱它。

使用TF.exe 工作区命令从 Shell 创建/删除工作区。然后TF.exe开始检索文件。