11

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

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

在不创建新工作区的情况下是否有针对整个文件夹的解决方案?

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

假设:

  • 我可以在我的计算机上从 Visual Studio 访问 TFS
  • 我想从TFS 项目中ChangeSetNumber的文件夹中获取变更 集DesiredFoldertProj

我从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

4 回答 4

15

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

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%
于 2012-05-09T21:14:11.527 回答
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();
    }
}
于 2013-11-05T00:21:58.343 回答
5

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

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

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

所以我建议你为你想要做的操作创建一个专用的Workspace,并在你判断它合适的时候去掉它。

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

于 2012-05-03T19:33:05.700 回答
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
于 2015-08-13T15:33:24.547 回答