Domanda

C'è un modo per cercare l'ultima versione di ogni file in TFS per una stringa o una regex specifica?Questa è probabilmente l'unica cosa che mi manca di Visual Source Safe...

Attualmente eseguo Get Latest sull'intera codebase e utilizzo Windows Search, ma diventa piuttosto doloroso con oltre 1 GB di codice in 75.000 file.

MODIFICARE:Ho provato gli strumenti menzionati, ma l'opzione "Ricerca con caratteri jolly" sembra cercare solo i nomi dei file e non i contenuti.

AGGIORNAMENTO:Abbiamo implementato un'opzione di ricerca personalizzata in un'installazione MOSS (Search Server) esistente.

È stato utile?

Soluzione

Team Foundation Server 2015 (locale) e Visual Studio Team Services (versione cloud) includono il supporto integrato per la ricerca in tutto il codice e negli elementi di lavoro.

Puoi eseguire semplici ricerche di stringhe come foo, operazioni booleane come foo OR bar o cose specifiche della lingua più complesse come class:WebRequest

screenshot of code search filter syntax

Puoi leggere di più a riguardo qui: https://www.visualstudio.com/en-us/docs/search/overview

Altri suggerimenti

Nel mio caso, scrivere una piccola utility in C# ha aiutato.Link che mi hanno aiutato -http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Come elencare i file di un progetto team utilizzando 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;
    }
}
}

Esiste un'altra soluzione alternativa, che sembra essere più attraente.

  1. Configura un server di ricerca: potrebbe essere qualsiasi macchina/server Windows
  2. Configurazione a Servizio di notifica TFS*(BissubScribe) Per ottenere, eliminare, aggiornare i file ogni volta che si verifica un check -in.Quindi questo è un servizio Web che si comporta come un ascoltatore sul server TFS e aggiorna/sincronizza i file e le cartelle sul server di ricerca.- ciò migliorerà notevolmente la precisione (ricerca in tempo reale) ed eviterà il carico una tantum di effettuare operazioni periodiche
  3. Imposta un servizio di indicizzazione/ricerca indicizzata di Windows sul server di ricerca per la cartella root
  4. Esporre un servizio Web per restituire i risultati della ricerca

Ora con tutta la configurazione di cui sopra, hai alcune opzioni per il client:

  1. Configura una pagina Web per chiamare il servizio di ricerca e formattare i risultati da mostrare sulla pagina Web: puoi anche integrare questa pagina Web all'interno di Visual Studio (tramite una macro o un componente aggiuntivo)
  2. Crea un'interfaccia client Windows (winforms/wpf) per chiamare il servizio di ricerca e formattare i risultati e mostrarli sull'interfaccia utente: puoi anche integrare questo strumento client all'interno di Visual Studio tramite VSPackage o componente aggiuntivo

Aggiornamento:Ho seguito questa strada e ha funzionato bene.Volevo solo aggiungere qualcosa a questo.

Link di riferimento:

  1. Usa questo strumento invece di bissubscribe.exe
  2. Gestione degli eventi TFS
  3. Notifiche del sistema del team

Se installi TFS 2008 PowerTools otterrai un'azione "Trova nel controllo del codice sorgente" nel menu di scelta rapida di Team Explorer.

Utensili elettrici TFS2008

Abbiamo creato una soluzione per il controllo del codice sorgente di Team Foundation Server (non SourceSafe come dici tu) simile a quanto suggerisce Grant;TF Get programmato, Search Server Express.Tuttavia, l'IFilter utilizzato per i file C# (testo) non forniva i risultati desiderati, quindi convertiamo i file sorgente in file .htm.Ora possiamo aggiungere ulteriori metadati ai file come:

  • Autore (lo definiamo come la persona che ha effettuato l'ultimo check-in nel file)
  • Codifica colore (nella nostra lista di cose da fare)
  • Numero di modifiche che indicano potenziali problemi di progettazione (nella nostra lista di cose da fare)
  • Integrazione con l'IDE VSTS come la funzionalità SmartSearch di Koder
  • eccetera.

Preferiremmo tuttavia un gestore di protocollo per TFS Source Control e un IFilter del codice sorgente dedicato per una soluzione molto più mirata.

Va bene,

  1. Gli utensili elettrici TFS2008 lo fanno non hanno una funzione di ricerca nei file."Gli strumenti Trova nel controllo del codice sorgente offrono la possibilità di individuare file e cartelle nel controllo del codice sorgente in base all'elemento stato o con a carta jolly espressione."

  2. Esiste un programma Windows con questa funzionalità pubblicata su CodePlex.L'ho appena installato e testato e funziona bene.

Ciò è ora possibile a partire da TFS 2015 utilizzando il file Code Search collegare. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

La ricerca viene eseguita tramite l'interfaccia web e non richiede il download del codice sul computer locale, il che è carino.

Un'altra soluzione è usare "ctrl+shift+F".È possibile modificare il percorso di ricerca in una directory locale anziché in una soluzione o un progetto.Questo prenderà semplicemente il posto della ricerca sul desktop e dovrai comunque ottenere il codice più recente, ma ti consentirà di rimanere in Visual Studio per eseguire la ricerca.

Questo componente aggiuntivo afferma di avere la funzionalità che credo tu cerchi:

Aiutanti della Team Foundation

Questa ricerca di un collegamento a un file spiega come trovare un file. Ho dovuto armeggiare con i consigli per farlo funzionare.

  1. cd "C:\Programmi (x86)\Microsoft Visual Studio 12.0\Common7\IDE"
  2. tf dir "$/*.sql" /recursive /server:http://mytfsserver:8080/tfs

Nel caso del comando cd, ho eseguito il comando cd perché stavo cercando il file tf.exe.Era più semplice iniziare semplicemente da quella directory piuttosto che aggiungere l'intero percorso.Ora che ho capito come farlo funzionare, utilizzerei il percorso assoluto tra virgolette.

In caso di ricerca tf, ho iniziato dalla radice del server con $/ e ho cercato tutti i file che terminavano con sql cioè. *.sql.Se non vuoi iniziare dalla radice, usa "$/myproject/*.sql" Invece.

OH!Questo non risolve la parte della domanda relativa alla ricerca nel file, ma la mia ricerca su Google mi ha portato qui per trovare file tra gli altri collegamenti.

Supponendo che tu lo abbia fatto Blocco note++, una funzionalità spesso mancata è "Trova nei file", che è estremamente veloce e include filtri, espressioni regolari, sostituzione e tutte le chicche N++.

Al momento non esiste un modo per farlo immediatamente, ma esiste un suggerimento di User Voice per aggiungerlo: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

Anche se dubito che sia semplice come premere un interruttore, se tutti coloro che hanno visualizzato questa domanda votassero a favore, MS probabilmente implementerebbe qualcosa.

Aggiornamento:Appena letto Il blog di Brian Harry, che mostra questa richiesta come se fosse sul loro radar, e la versione online di Visual Studio ha un supporto limitato per la ricerca in cui git viene utilizzato come vcs: http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/13/announcing-limited-preview-for-visual-studio-online-code-search.aspx.Da questo penso sia giusto dire che è solo questione di tempo...

Aggiornamento 2: Ora è disponibile un'estensione fornita da Microsoft,Ricerca del codice che consente la ricerca nel codice e negli elementi di lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top