In Dateien suchen: Durchsuchen Sie den gesamten Code in Team Foundation Server


102

Gibt es eine Möglichkeit, die neueste Version jeder Datei in TFS nach einer bestimmten Zeichenfolge oder Regex zu durchsuchen? Dies ist wahrscheinlich das einzige, was ich von Visual Source Safe vermisse ...

Derzeit führe ich ein Get Latest für die gesamte Codebasis durch und verwende die Windows-Suche. Dies ist jedoch bei über 1 GB Code in 75.000 Dateien ziemlich schmerzhaft.

EDIT : Versucht die Elektrowerkzeuge erwähnt, aber die „Wildcard - Suche“ Option erscheint nur suchen Dateinamen und den Inhalt nicht.

UPDATE : Wir haben eine angepasste Suchoption in eine vorhandene MOSS-Installation (Search Server) implementiert.

Antworten:


57

Team Foundation Server 2015 (lokal) und Visual Studio Team Services (Cloud-Version) bieten integrierte Unterstützung für die Suche in all Ihren Code- und Arbeitselementen.

Sie können einfache Zeichenfolgensuchen wie fooboolesche Operationen wie foo OR baroder komplexere sprachspezifische Dinge wie durchführenclass:WebRequest

Screenshot der Syntax des Codesuchfilters

Weitere Informationen finden Sie hier: https://www.visualstudio.com/en-us/docs/search/overview


2
Siehe meine Antwort unten und stimme zu;) Dies ist ab TFS 2015 mit dem Code SearchPlugin möglich. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

Die Codesuche ist derzeit nur für Visual Studio Team Services verfügbar. Die Unterstützung für Team Foundation Server befindet sich in der Entwicklung und wird in der nächsten Version enthalten sein.
Paparush

Die Codesuche ist jetzt in TFS 2017 oder neuer verfügbar.
Csrowell

Wenn Sie versuchen, zur Version 2015 dieses Dokuments zu wechseln: "Die angeforderte Seite ist für Team Foundation Server 2015 nicht verfügbar."
AaronLS

16

In meinem Fall hat das Schreiben eines kleinen Dienstprogramms in C # geholfen. Links, die mir geholfen haben - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Wie liste ich Dateien eines Teamprojekts mit tfs api auf?

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

Es gibt eine andere alternative Lösung, die attraktiver zu sein scheint.

  1. Einrichten eines Suchservers - kann ein beliebiger Windows-Computer / Server sein
  2. Richten Sie einen TFS-Benachrichtigungsdienst * (Bissubscribe) ein, um bei jedem Einchecken Dateien abzurufen, zu löschen und zu aktualisieren. Dies ist also ein Webdienst, der sich wie ein Listener auf dem TFS-Server verhält und die Dateien und Ordner auf dem Suchserver aktualisiert / synchronisiert. - Dies verbessert die Genauigkeit (Live-Suche) erheblich und vermeidet die einmalige Belastung durch periodische Abrufe
  3. Richten Sie auf dem Suchserver einen Indizierungsdienst / eine Windows-indizierte Suche nach dem Stammordner ein
  4. Stellen Sie einen Webdienst bereit, um Suchergebnisse zurückzugeben

Mit all den oben genannten Einstellungen haben Sie nun einige Optionen für den Client:

  1. Richten Sie eine Webseite ein, um den Suchdienst aufzurufen und die auf der Webseite anzuzeigenden Ergebnisse zu formatieren. Sie können diese Webseite auch in Visual Studio integrieren (über ein Makro oder ein Add-In).
  2. Erstellen Sie eine Windows-Client-Oberfläche (winforms / wpf), um den Suchdienst aufzurufen, die Ergebnisse zu formatieren und auf der Benutzeroberfläche anzuzeigen. Sie können dieses Client-Tool auch über VSPackages oder Add-In in Visual Studio integrieren

Update : Ich bin diesen Weg gegangen und es hat gut funktioniert. Ich wollte nur noch etwas hinzufügen.

Referenzlinks:

  1. Verwenden Sie dieses Tool anstelle von bissubscribe.exe
  2. Behandlung von TFS-Ereignissen
  3. Team System Benachrichtigungen

12

Wenn Sie TFS 2008 PowerTools installieren, wird im Team Explorer-Kontextmenü die Aktion "In Quellcodeverwaltung suchen" angezeigt.

TFS2008 Elektrowerkzeuge


4
@muerte es ist lustig, dass sie "Elektrowerkzeuge" genannt werden. Einige würden sagen, dass so etwas wie ein Rollback "Grundfunktionalität" ist. :-)
Iain Holder

Nun, Sie können einen Rollback sicherlich manuell durchführen, es ist einfach kein Ein-Klick-Vorgang. Vielleicht sollte es sein ..
Jeff Atwood

3
Gute Antwort, toter Link: microsoft.com/downloads/…
wcm

15
Ich denke, dass nur nach Datei / Ordnernamen suchen
Kiddo

9
-1 Power Tools suchen Datei nicht Inhalt , nur Datei- / Ordnernamen.
Eugene Beresovsky

6

Wir haben eine Lösung für die Team Foundation Server-Quellcodeverwaltung (nicht SourceSafe, wie Sie bereits erwähnt haben) eingerichtet, die der von Grant vorgeschlagenen ähnelt. geplanter TF Get, Search Server Express. Der für C # -Dateien (Text) verwendete IFilter lieferte jedoch nicht die gewünschten Ergebnisse, sodass wir Quelldateien in HTM-Dateien konvertieren. Wir können jetzt zusätzliche Metadaten zu den Dateien hinzufügen, wie zum Beispiel:

  • Autor (wir definieren es als die Person, die die Datei zuletzt eingecheckt hat)
  • Farbcodierung (auf unserer ToDo-Liste)
  • Anzahl der Änderungen, die auf mögliche Designprobleme hinweisen (auf unserer Aufgabenliste)
  • Integration in die VSTS IDE wie Koders SmartSearch
  • etc.

Wir würden jedoch einen Protokollhandler für die TFS-Quellcodeverwaltung und einen dedizierten Quellcode-IFilter für eine viel gezieltere Lösung bevorzugen.


1
Gibt es Pläne, die .htm-Konvertierung als Open Source zu nutzen?
technomalogical

6

In Ordnung,

  1. TFS2008 Power Tools verfügen nicht über eine Funktion zum Suchen von Dateien. "Die Tools" In Quellcodeverwaltung suchen "bieten die Möglichkeit, Dateien und Ordner in der Quellcodeverwaltung nach dem Status des Elements oder mit einem Platzhalterausdruck zu suchen."

  2. Auf CodePlex ist ein Windows-Programm mit dieser Funktionalität verfügbar . Ich habe das gerade installiert und getestet und es funktioniert gut.


Es ist schuppig und langsam, aber es scheint zu tun, was es verspricht
Paul Michaels

Ich erhalte eine Fehlermeldung wie diese Personen über den unten stehenden Link. Hat das noch jemand erlebt? tfssearchcode.codeplex.com/workitem/32475
Strider

6

Dies ist ab TFS 2015 mit dem Code SearchPlugin möglich. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

Die Suche erfolgt über die Weboberfläche und erfordert nicht, dass Sie den Code auf Ihren lokalen Computer herunterladen, was sehr hilfreich ist.


Hinweis: Die Codesuche ist derzeit nur für Visual Studio Team Services verfügbar. Die Unterstützung für Team Foundation Server befindet sich in der Entwicklung und wird in der nächsten Version enthalten sein.
Jamie

3

Eine andere Lösung ist die Verwendung von "Strg + Umschalt + F". Sie können den Suchort in ein lokales Verzeichnis anstatt in eine Lösung oder ein Projekt ändern. Dies ersetzt lediglich die Desktopsuche und Sie müssen immer noch den neuesten Code abrufen. Sie können jedoch in Visual Studio bleiben, um Ihre Suche durchzuführen.


4
Behebt nicht das Problem der Suche in TFS-Codeversionen.
Craig

Nicht das, was sie wollten.
Dave

Nutzlos für die Suche nach Inhalten, die Sie nicht heruntergeladen haben. Könnte auch grep / findstr verwenden.
Jamie

2

Angenommen, Sie haben Notepad ++ , eine häufig übersehene Funktion ist "In Dateien suchen", die extrem schnell ist und Filter, reguläre Ausdrücke, Ersetzen und alle N ++ - Extras enthält.


1

Dieses Add-In behauptet, die Funktionalität zu haben, die Sie meiner Meinung nach suchen:

Team Foundation Sidekicks


Entschuldigung, ich sehe nicht, wo es bietet, in Dateien zu suchen?
Mark Glorie

4
Ich habe dieses Plug-In-Set früher heruntergeladen und kann nur nach Autor, Label, Datum usw. suchen, aber nicht in älteren Versionen von Dateien ...: \
Sandor Davidhazi

1

Diese Suche nach einem Dateilink erklärt, wie Sie eine Datei finden. Ich musste mich mit dem Rat herumschlagen, damit es funktioniert.

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

Im Fall des Befehls cd habe ich den Befehl cd ausgeführt, weil ich nach der Datei tf.exe gesucht habe. Es war einfacher, von diesen Verzeichnisversen aus zu beginnen und den gesamten Pfad hinzuzufügen. Jetzt, da ich verstehe, wie das funktioniert, würde ich den absoluten Pfad in Anführungszeichen verwenden.

Im Falle der tf-Suche habe ich im Stammverzeichnis des Servers mit begonnen $/und nach allen Dateien gesucht, die mit sqldh endeten *.sql. Wenn Sie nicht am Stamm beginnen möchten, verwenden Sie "$/myproject/*.sql"stattdessen.

Oh! Dies löst nicht die Suche im Dateiteil der Frage, aber meine Google-Suche hat mich hierher gebracht, um Dateien unter anderen Links zu finden.


1

Es gibt derzeit keine Möglichkeit, dies sofort zu tun, aber es gibt einen User Voice-Vorschlag zum Hinzufügen: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- Volltextsuche von Arbeitselementen

Obwohl ich bezweifle, dass es so einfach ist, einen Schalter zu betätigen, würde MS wahrscheinlich etwas implementieren, wenn jeder, der diese Frage gesehen hat, dafür gestimmt hätte.

Update: Lesen Sie einfach Brian Harrys Blog , in dem diese Anfrage als auf dem Radar angezeigt wird, und die Online-Version von Visual Studio bietet nur eingeschränkte Unterstützung für die Suche, wo git als vcs verwendet wird: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / Ankündigung einer eingeschränkten Vorschau für Visual Studio Online-Codesuche.aspx . Ich denke, es ist fair zu sagen, dass es nur eine Frage der Zeit ist ...

Update 2: Es gibt jetzt eine Microsoft bereitgestellt Erweiterung Code Search , die im Code der Suche als auch Elemente wie in der Arbeit ermöglicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.