Trova nei file: cerca tutto il codice in Team Foundation Server


102

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

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

MODIFICA : Ho provato i powertools menzionati, ma l'opzione "Wildcard Search" sembra cercare solo i nomi dei file e non i contenuti.

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

Risposte:


57

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

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

screenshot della sintassi del filtro di ricerca del codice

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


2
Vedi la mia risposta di seguito e votala a favore;) Questo è ora possibile a partire da TFS 2015 utilizzando il Code Searchplug-in. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

Ricerca codice è attualmente disponibile solo per Visual Studio Team Services. Il supporto per Team Foundation Server è in fase di sviluppo e sarà incluso nella prossima versione.
paparush

Ricerca codice è ora disponibile in TFS 2017 o versioni successive.
csrowell

Se si tenta di passare alla versione 2015 di tale documento: "La pagina richiesta non è disponibile per Team Foundation Server 2015."
AaronLS

16

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

13

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

  1. Imposta un server di ricerca: potrebbe essere qualsiasi macchina / server Windows
  2. Imposta un servizio di notifica TFS * (Bissubscribe) per ottenere, eliminare e aggiornare i file ogni volta che viene effettuato un check-in. Quindi questo è un servizio Web che agisce come un listener sul server TFS e aggiorna / sincronizza i file e le cartelle sul server di ricerca. - questo migliorerà notevolmente la precisione (ricerca dal vivo) ed eviterà il carico una tantum di effettuare acquisizioni periodiche
  3. Imposta un servizio di indicizzazione / ricerca indicizzata di Windows sul server di ricerca per la cartella principale
  4. Esponi un servizio web per restituire risultati di ricerca

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

  1. Imposta 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 VSPackages o add-in

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

Link di riferimento:

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

12

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

Utensili elettrici TFS2008


4
@muerte è buffo che si chiamino "utensili elettrici". Alcuni direbbero che fare qualcosa come un rollback è una "funzionalità di base". :-)
Iain Holder

beh, puoi certamente fare un rollback manualmente, non è solo un'operazione con un clic. Forse dovrebbe essere ...
Jeff Atwood,

3
Buona risposta, collegamento guasto: microsoft.com/downloads/…
wcm

15
Penso che cerchi solo il nome del file / cartella
Kiddo

9
-1 gli utensili elettrici non cercano il contenuto dei file , solo i nomi di file / cartelle.
Eugene Beresovsky

6

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

  • Autore (lo definiamo come l'ultima persona che ha effettuato il check-in nel file)
  • Codifica a colori (sulla nostra lista delle 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 funzione SmartSearch di Koders
  • eccetera.

Tuttavia, preferiremmo un gestore di protocollo per TFS Source Control e un IFilter di codice sorgente dedicato per una soluzione molto più mirata.


1
Hai in programma di rendere open source la conversione .htm?
tecnomalogico

6

Va bene,

  1. TFS2008 Power Tools non ha una funzione di ricerca nei file. "Find in strumenti di controllo sorgente forniscono la capacità di individuare i file e le cartelle in controllo del codice sorgente dal dell'elemento di stato o con un carattere jolly espressione".

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


È traballante e lento, ma sembra che faccia quello che dice sulla latta
Paul Michaels,

Ricevo un errore come queste persone hanno ottenuto nel link sottostante. Qualcun altro lo sta vivendo? tfssearchcode.codeplex.com/workitem/32475
strider

6

Questo è ora possibile a partire da TFS 2015 utilizzando il Code Searchplug-in. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

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


Nota: la ricerca del codice è attualmente disponibile solo per Visual Studio Team Services. Il supporto per Team Foundation Server è in fase di sviluppo e sarà incluso nella prossima versione.
Jamie

3

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


4
Non risolve il problema della ricerca nelle versioni del codice TFS.
Craig

Non quello che volevano.
Dave

Inutile per cercare contenuti che non hai scaricato. Tanto vale usare grep / findstr.
Jamie

2

Supponendo che tu abbia Notepad ++ , una funzionalità spesso persa è "Trova nei file", che è estremamente veloce e viene fornito con filtri, espressioni regolari, sostituisci e tutte le chicche di N ++.


1

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

Team Foundation Sidekicks


Scusa, non vedo dove si offre di cercare all'interno dei file?
Mark Glorie

4
Al momento ho scaricato questo set di plug-in in precedenza e ti consente solo di cercare per autore, etichetta, data ecc. Ma non all'interno di versioni precedenti dei file ...: \
Sandor Davidhazi

1

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

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

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

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

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


1

Al momento non è possibile eseguire questa operazione immediatamente, ma è disponibile un suggerimento per la voce utente per aggiungerla: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- full-text-search-di-lavoro-articoli

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

Aggiornamento: basta leggere il blog di Brian Harry , che mostra questa richiesta come sul loro radar, e la versione online di Visual Studio ha un supporto limitato per la ricerca in cui git è usato come vcs: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / annunciare-anteprima-limitata-per-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 codice , che consente la ricerca nel codice e negli elementi di lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.