Pregunta

¿Hay alguna manera de buscar en la última versión de cada archivo en TFS una cadena o expresión regular específica?Esto es probablemente lo único que extraño de Visual Source Safe...

Actualmente realizo Obtener lo último en todo el código base y uso la Búsqueda de Windows, pero esto resulta bastante doloroso con más de 1 GB de código en 75.000 archivos.

EDITAR:Probé las herramientas eléctricas mencionadas, pero la opción "Búsqueda con comodines" parece buscar solo nombres de archivos y no contenidos.

ACTUALIZAR:Hemos implementado una opción de búsqueda personalizada en una instalación MOSS (Servidor de búsqueda) existente.

¿Fue útil?

Solución

Team Foundation Server 2015 (local) y Visual Studio Team Services (versión en la nube) incluyen soporte integrado para buscar en todo su código y elementos de trabajo.

Puedes hacer búsquedas de cadenas simples como foo, operaciones booleanas como foo OR bar o cosas más complejas específicas del lenguaje como class:WebRequest

screenshot of code search filter syntax

Puedes leer más sobre esto aquí: https://www.visualstudio.com/en-us/docs/search/overview

Otros consejos

En mi caso, me ayudó escribir una pequeña utilidad en C#.Enlaces que me ayudaron -http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

¿Cómo enumerar archivos de un proyecto de equipo usando tfs api?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;
using System.IO;

namespace TFSSearch
{
class Program
{
    static string[] textPatterns = new[] { "void main(", "exception", "RegisterScript" };  //Text to search
    static string[] filePatterns = new[] { "*.cs", "*.xml", "*.config", "*.asp", "*.aspx", "*.js", "*.htm", "*.html", 
                                           "*.vb", "*.asax", "*.ashx", "*.asmx", "*.ascx", "*.master", "*.svc"}; //file extensions

    static void Main(string[] args)
    {
        try
        {
            var tfs = TfsTeamProjectCollectionFactory
             .GetTeamProjectCollection(new Uri("http://{tfsserver}:8080/tfs/}")); // one some servers you also need to add collection path (if it not the default collection)

            tfs.EnsureAuthenticated();

            var versionControl = tfs.GetService<VersionControlServer>();


            StreamWriter outputFile = new StreamWriter(@"C:\Find.txt");
            var allProjs = versionControl.GetAllTeamProjects(true);
            foreach (var teamProj in allProjs)
            {
                foreach (var filePattern in filePatterns)
                {
                    var items = versionControl.GetItems(teamProj.ServerItem + "/" + filePattern, RecursionType.Full).Items
                                .Where(i => !i.ServerItem.Contains("_ReSharper"));  //skipping resharper stuff
                    foreach (var item in items)
                    {
                        List<string> lines = SearchInFile(item);
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine("FILE:" + item.ServerItem);
                            outputFile.WriteLine(lines.Count.ToString() + " occurence(s) found.");
                            outputFile.WriteLine();
                        }
                        foreach (string line in lines)
                        {
                            outputFile.WriteLine(line);
                        }
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine();
                        }
                    }
                }
                outputFile.Flush();
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }
        Console.WriteLine("========");
        Console.Read();
    }

    // Define other methods and classes here
    private static List<string> SearchInFile(Item file)
    {
        var result = new List<string>();

        try
        {
            var stream = new StreamReader(file.DownloadFile(), Encoding.Default);

            var line = stream.ReadLine();
            var lineIndex = 0;

            while (!stream.EndOfStream)
            {
                if (textPatterns.Any(p => line.IndexOf(p, StringComparison.OrdinalIgnoreCase) >= 0))
                    result.Add("=== Line " + lineIndex + ": " + line.Trim());

                line = stream.ReadLine();
                lineIndex++;
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }

        return result;
    }
}
}

Existe otra solución alternativa que parece más atractiva.

  1. Configurar un servidor de búsqueda: podría ser cualquier máquina/servidor con Windows
  2. Configurar un Servicio de notificación TFS* (Bissubscribe) para obtener, eliminar, Actualizar archivos cada vez que se realiza una protección sucede.Por lo tanto, este es un servicio web que actúa como un oyente en el TFS servidor y actualiza/sincroniza los archivos y carpetas en el servidor de búsqueda.- Esto mejorará drásticamente la precisión (búsqueda en vivo) y evitará la carga única de realizar búsquedas periódicas.
  3. Configuración de un servicio de indexación/Búsqueda indexada de Windows en el servidor de búsqueda para la carpeta raíz
  4. Exponer un servicio web para devolver los resultados de búsqueda

Ahora con toda la configuración anterior, tienes algunas opciones para el cliente:

  1. Configure una página web para llamar al servicio de búsqueda y formatee los resultados para mostrarlos en la página web; también puede integrar esta página web dentro de Visual Studio (a través de una macro o un complemento)
  2. Cree una interfaz de cliente de Windows (winforms/wpf) para llamar al servicio de búsqueda, formatear los resultados y mostrarlos en la interfaz de usuario; también puede integrar esta herramienta de cliente dentro de Visual Studio a través de VSPackages o complementos.

Actualizar:Seguí esta ruta y ha funcionado muy bien.Sólo quería agregar algo a esto.

Enlaces de referencia:

  1. Use esta herramienta en lugar de bissubscribe.exe
  2. Manejo de eventos TFS
  3. Notificaciones del sistema de equipo

Si instala TFS 2008 PowerTools, obtendrá la acción "Buscar en control de código fuente" en el menú contextual de Team Explorer.

TFS2008 Herramientas eléctricas

Hemos configurado una solución para Team Foundation Server Source Control (no SourceSafe como usted menciona) similar a lo que sugiere Grant;TF Get programado, Search Server Express.Sin embargo, el IFilter utilizado para archivos C# (texto) no estaba dando los resultados que queríamos, por lo que convertimos los archivos fuente a archivos .htm.Ahora podemos agregar metadatos adicionales a los archivos como:

  • Autor (lo definimos como la persona que revisó el archivo por última vez)
  • Codificación de colores (en nuestra lista de tareas pendientes)
  • Número de cambios que indican posibles problemas de diseño (en nuestra lista de tareas pendientes)
  • Integre con VSTS IDE como la función Koders SmartSearch
  • etc.

Sin embargo, preferiríamos un controlador de protocolo para TFS Source Control y un IFilter de código fuente dedicado para una solución mucho más específica.

Bueno,

  1. Las herramientas eléctricas TFS2008 no no tener una función de búsqueda en archivos."Las herramientas Buscar en control de código fuente brindan la capacidad de ubicar archivos y carpetas en el control de código fuente según el elemento estado o con un comodín expresión."

  2. Hay un programa de Windows con esta funcionalidad publicado en CódigoPlex.Acabo de instalarlo y probarlo y funciona bien.

Esto ahora es posible a partir de TFS 2015 utilizando el Code Search enchufar. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

La búsqueda se realiza a través de la interfaz web y no requiere que descargue el código en su máquina local, lo cual es bueno.

Otra solución es utilizar "ctrl+shift+F".Puede cambiar la ubicación de búsqueda a un directorio local en lugar de una solución o proyecto.Esto simplemente reemplazará la búsqueda en el escritorio y aún necesitará obtener el código más reciente, pero le permitirá permanecer dentro de Visual Studio para realizar la búsqueda.

Este complemento afirma tener la funcionalidad que creo que busca:

Compañeros de la Fundación del Equipo

Esta búsqueda de un enlace de archivo explica cómo encontrar un archivo. Tuve que trastear con los consejos para que funcionara.

  1. cd "C:\Archivos de programa (x86)\Microsoft Visual Studio 12.0\Common7\IDE"
  2. tf dir "$/*.sql" /recursivo /servidor:http://mytfsserver:8080/tfs

En el caso del comando cd, realicé el comando cd porque estaba buscando el archivo tf.exe.Fue más fácil comenzar desde ese directorio en lugar de agregar la ruta completa.Ahora que entiendo cómo hacer que esto funcione, usaría la ruta absoluta entre comillas.

En el caso de la búsqueda tf, comencé en la raíz del servidor con $/ y busqué todos los archivos que terminaban con sql es decir. *.sql.Si no desea comenzar desde la raíz, utilice "$/myproject/*.sql" en cambio.

¡Oh!Esto no resuelve la parte de la pregunta sobre la búsqueda en el archivo, pero mi búsqueda en Google me trajo aquí para encontrar archivos entre otros enlaces.

suponiendo que tienes Bloc de notas++, una característica que a menudo se pasa por alto es 'Buscar en archivos', que es extremadamente rápida y viene con filtros, expresiones regulares, reemplazo y todas las ventajas de N++.

Actualmente no hay forma de hacer esto de forma inmediata, pero hay una sugerencia de voz del usuario para agregarlo: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

Si bien dudo que sea tan simple como presionar un interruptor, si todos los que vieron esta pregunta votaran a favor, MS probablemente implementaría algo.

Actualizar:Acabo de leer El blog de Brian Harry., que muestra que esta solicitud está en su radar, y la versión en línea de Visual Studio tiene soporte limitado para buscar dónde se usa git como vcs: http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/13/annunciando-limited-preview-for-visual-studio-online-code-search.aspx.A partir de esto creo que es justo decir que es sólo cuestión de tiempo...

Actualización 2: Ahora hay una extensión proporcionada por Microsoft,Búsqueda de código lo que permite buscar tanto en código como en elementos de trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top