如何从TFS文件夹的特定版本,而无需创建工作区?(How to get specific versi

2019-06-24 03:19发布

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

我知道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

开始下载的解决方案时,有必要确认删除源代码控制的关联。

Answer 1:

我用这个语法临时工作区:

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%


Answer 2:

我发现,您可以通过TFS公开HTTP API做到这一点。 “签名”的网址如下:

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

所以,如果你有一个项目在DefaultCollection名为“MyProject的”,并希望得到一个名为“我的功能”文件夹的内容:

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


Answer 3:

我想你应该创建一个临时工作区来获取你想要的内容,然后删除工作区和保留本地项目。

在TFS工作区是一个什么样的服务器上,你选择你想要的文件夹(S)在本地检索和在这里您可以存储文件夹/文件给定的工作区的局部视图。

它不是像SourceSafe中你不绑定到一个工作区,你可以有你想要一个给定的计算机上许多。

所以,我建议你创建你想做的事,当你判断它适当的摆脱它的操作的专用工作区。

使用TF.exe工作空间命令创建/删除壳牌工作区。 然后TF.exe得到恢复的文件。



Answer 4:

您可以使用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


文章来源: How to get specific version of folder from tfs without creating a workspace?