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

时间:2012-05-03 13:41:21

标签: command-line tfs tfs2010 tfs-sdk visual-studio-macros

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

我知道TFS Get Specific Version into separate folder(带工作空间)和Need command to get a file from TFS without a workspace(一个文件)。

在没有创建新工作区的情况下,整个文件夹是否有一些解决方案?

修改 我发现接受的答案太雄心勃勃了。我需要更简单的东西。

假设:

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

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

4 个答案:

答案 0 :(得分: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%

答案 1 :(得分:7)

我发现你可以通过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();
    }
}

答案 2 :(得分:4)

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

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

与SourceSafe不同,您不仅仅绑定到一个工作区,您可以在给定计算机上拥有任意数量的内容。

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

使用TF.exe workspace命令从命令行管理程序创建/删除工作区。然后TF.exe get检索文件。

答案 3 :(得分: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
相关问题