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

问题描述 投票:0回答:4

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

我知道 TFS 将特定版本放入单独的文件夹(带工作区)和 需要命令在没有工作区的情况下从 TFS 获取文件(一个文件)。

是否有一些解决方案可以在不创建新工作区的情况下处理整个文件夹?

编辑 我发现接受的答案过于雄心勃勃。我需要更简单的东西。

假设:

  • 我可以从计算机上的 Visual Studio 访问 TFS
  • 我想从文件夹中获取
    ChangeSetNumber
    变更集
    DesiredFolder
    在 TFS 项目中
    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

启动下载的解决方案时需要确认删除源代码管理关联。

编辑2023 我想使用该脚本,但出现以下错误

command-line tfs tfs-sdk visual-studio-macros
4个回答
16
投票

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

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%

8
投票

我发现您可以通过 TFS 公开的 HTTP api 来完成此操作。 URL 的“签名”如下:

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

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

http://MyTfsServer:8080/tfs/DefaultCollection/MyProject/_api/_versioncontrol/itemContentZipped?version=C1001&path=%24%2FMyProject%2FMyFeature

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

我将其实现为

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

5
投票

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

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

它与 SourceSafe 不同,您不仅限于一个工作区,您可以在给定计算机上拥有任意多个工作区。

所以我建议您为您想要执行的操作创建一个专用的工作区,并在您认为合适时将其删除。

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


1
投票

您可以使用

tf view
获取特定文件,而无需创建工作区。

Retrieves a specific version of a file to a temporary folder on your computer and displays it.

tf vc view [/collection:TeamProjectCollectionUrl]
       [/console] [/recursive] [/output:localfile]
       [/shelveset:shelvesetname[;owner]] [/noprompt] itemspec
       [/version:versionspec] [/login:username,[password]]

Versionspec:
Date/Time         D"any .Net Framework-supported format"
                  or any of the date formats of the local machine
Changeset number  Cnnnnnn
Label             Llabelname
Latest version    T
Workspace         Wworkspacename;workspaceowner
© www.soinside.com 2019 - 2024. All rights reserved.