我想在特定时间(变更集)获取项目的源代码。所以我需要下载整个文件夹。我想在不同的时间做这件事并且处理不同的工作空间不是很方便。
我知道TFS Get Specific Version into separate folder(带工作空间)和Need command to get a file from TFS without a workspace(一个文件)。
在没有创建新工作区的情况下,整个文件夹是否有一些解决方案?
修改 我发现接受的答案太雄心勃勃了。我需要更简单的东西。
假设:
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
启动下载的解决方案时,必须确认删除源控件关联。
答案 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