command-line tfs tfs2010 tfs-sdk visual-studio-macros

command line - ¿Cómo obtener una versión específica de la carpeta desde tfs sin crear un espacio de trabajo?



command-line tfs2010 (4)

Creo que debería crear un espacio de trabajo temporal para recuperar el contenido que desea, luego eliminar el espacio de trabajo y conservar los elementos locales.

Un espacio de trabajo en TFS es una vista local de lo que hay en el servidor; para un espacio de trabajo determinado, usted elige qué carpeta (s) desea recuperar localmente y dónde almacenará las carpetas / archivos.

No es como SourceSafe que no estás obligado a un solo espacio de trabajo, puedes tener tantos como quieras en una computadora determinada.

Por lo tanto, le sugiero que cree un espacio de trabajo dedicado para la operación que desea hacer y que se deshaga de él cuando lo juzgue apropiado.

Use el comando de espacio de trabajo TF.exe para crear / eliminar un espacio de trabajo del Shell. Luego, TF.exe puede recuperar los archivos.

Me gustaría obtener el código fuente de un proyecto en un momento específico (changeset). Entonces necesito descargar toda la carpeta. Me gustaría hacerlo para diferentes tiempos y manejar un espacio de trabajo diferente no es muy conveniente.

Conozco TFS Get Specific Version en una carpeta separada (con workspace) y Need command para obtener un archivo de TFS sin un workspace (un archivo).

¿Hay alguna solución para toda la carpeta sin crear un nuevo espacio de trabajo?

Editar Encontré que la respuesta aceptada es demasiado ambiciosa. Necesitaba algo más simple.

Suposiciones

  • Puedo acceder a TFS desde Visual Studio en mi computadora
  • Deseo obtener el conjunto de cambios ChangeSetNumber de la carpeta DesiredFolder en el proyecto TFS tProj

Ejecuto el siguiente lote desde una carpeta de destino en Símbolo del sistema de 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

Es necesario confirmar la eliminación de la asociación de control de origen cuando se inicia la solución descargada.


Utilizo esta sintaxis para espacios de trabajo temporales:

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%


Descubrí que puedes hacerlo a través de la API HTTP que expone TFS. La "firma" de la URL es la siguiente:

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

Entonces, si tiene un proyecto llamado "MyProject" en DefaultCollection, y quiere obtener el contenido de una carpeta llamada "MyFeature":

http://MyTfsServer:8080/tfs/DefaultCollection/MyProject/_api/_versioncontrol/itemContentZipped?version=C1001&path=%24%2FMyProject%2FMyFeature

Creo que la "versión" puede ser cualquier especificación de versión, que está documentada en la documentación de la API de TFS. Mi ejemplo es solicitar la versión a partir del conjunto de cambios 1001. Estaba usando la API .NET para obtener una versión específica, lo cual es bastante sencillo, pero lento porque solo puede obtener un archivo a la vez. Estoy tratando de averiguar si esta misma funcionalidad está expuesta a través de la API de .NET porque descargar los archivos de esta manera es mucho más rápido que obtener un solo archivo a la vez.

Implementé esto como un método de extensión en Microsoft.TeamFoundation.VersionControl.Client.Item. Esto devuelve una secuencia que contiene un archivo zip. Lo había usado como parte de una tarea personalizada de MSBuild que luego guarda el contenido de esta secuencia en una ubicación de archivo.

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


Puede usar tf view para obtener un archivo específico sin crear un espacio de trabajo.

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