我想获得在特定的时间(变更)项目的源代码。 所以,我需要做的下载整个文件夹。 我想这样做对不同的时间和处理不同的工作区是不是很方便。
我知道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
开始下载的解决方案时,有必要确认删除源代码控制的关联。
我用这个语法临时工作区:
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%
我发现,您可以通过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();
}
}
我想你应该创建一个临时工作区来获取你想要的内容,然后删除工作区和保留本地项目。
在TFS工作区是一个什么样的服务器上,你选择你想要的文件夹(S)在本地检索和在这里您可以存储文件夹/文件给定的工作区的局部视图。
它不是像SourceSafe中你不绑定到一个工作区,你可以有你想要一个给定的计算机上许多。
所以,我建议你创建你想做的事,当你判断它适当的摆脱它的操作的专用工作区。
使用TF.exe工作空间命令创建/删除壳牌工作区。 然后TF.exe得到恢复的文件。
您可以使用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?