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

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

Se acerca de TFS Obtenga la versión específica en una carpeta separada (con espacio de trabajo) y Necesita un comando para obtener un archivo de TFS sin un espacio de trabajo (un archivo).

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

Editar He encontrado la respuesta aceptada demasiado ambiciosa. Necesitaba algo más simple.

Supuestos:

  • Puedo acceder a TFS desde Visual Studio en mi computadora
  • Quiero conseguir el ChangeSetNumber Conjunto de cambios de la carpeta DesiredFolder en 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 código fuente al iniciar la solución descargada.

preguntado el 03 de mayo de 12 a las 14:05

¿Puedes explicar/elaborar "para hacerlo en diferentes momentos"? -

@Nockawa: Tal vez debería haber diferentes conjuntos de cambios. Solo necesito estudiar si y por qué se comporta de manera diferente a como solía hacerlo. -

¿Puede explicar por qué la manipulación con un espacio de trabajo no es conveniente? Si tiene un espacio de trabajo configurado y desea sincronizar todo el proyecto con el conjunto de cambios 150, puede hacerlo con un comando: "tf get /version:150". -

@TaylorLafrinere: tengo el espacio de trabajo sincronizado con la rama de desarrollo actual, con la rama de la versión anterior. No, necesito algo temporal y preferiblemente independiente en tfs para estudiar el comportamiento de la versión anterior. Una vez finalizada la tarea, elimino. Si quisiera otra cosa, lo descargaría a la otra carpeta. No debería haber un camino hacia atrás a Tfs. Pero tal vez no entiendo correctamente el paradigma del espacio de trabajo. -

4 Respuestas

Uso 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%

contestado el 09 de mayo de 12 a las 22:05

Descubrí que puede hacer esto 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 desea 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 "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 de .NET para obtener una versión específica, que es bastante sencilla, pero lenta 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. Usé esto 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();
    }
}

respondido 06 nov., 13:16

¿Te comunicas con un servidor tfs con WebClient o al revés? ¿Agregarías un código de muestra? - ivanh

@IvanH Uso System.Net.WebRequest para obtener el contenido. Incluido un ejemplo. - marcapflug

Tenga en cuenta que el uso de este tipo de mecanismo no aprovechará los proxies de descarga, si los tiene configurados. De lo contrario, este es un mecanismo muy agradable. - Eduardo Thomson

El enfoque de "descarga .zip desde la dirección web" produjo los siguientes resultados aquí: para el $\Main carpeta que descargue un Main.zip carpeta con un completamente vacío Main carpeta dentro de ella; por $\Main\SomeFile.ext dio error No matching items found in $/Main/SomeFile.ext at the specified version, or you do not have permission to access them. - sergiol

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 dado, usted elige qué carpeta(s) desea recuperar localmente y dónde almacenará las carpetas/archivos.

No es como SourceSafe, usted está no atado a uno solo espacio de trabajo, puede tener tantos como desee en una computadora determinada.

Por lo tanto, le sugiero que cree un espacio de trabajo dedicado a la operación que desea realizar y se deshaga de él cuando lo considere oportuno.

Utilice el espacio de trabajo TF.exe Comando para crear/eliminar un espacio de trabajo desde el Shell. Entonces TF.exe obtener para recuperar los archivos.

contestado el 03 de mayo de 12 a las 20:05

Le daré una oportunidad. Pero me gustaría tener algo como vista pero para una carpeta. - ivanh

Puede usar el 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

Respondido 14 Oct 16, 18:10

Este enfoque solo funciona con archivos individuales, no con directorios. Ejecutar el comando como lo tiene aquí producirá un archivo masivo (llamado C:\path\to\localdirectory) que contiene todos los archivos en la carpeta concatenados. - JamesQMurphy

@JamesQMurphy, ¡gracias! No puedo creer que así es como funciona. Terminé resolviendo esto con una función de PowerShell usando una combinación de dir y view. Puedes verlo en este esencia. - clintparker

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.