ファイル内を検索:Team Foundation Server内のすべてのコードを検索します


102

TFS内のすべてのファイルの最新バージョンで特定の文字列または正規表現を検索する方法はありますか?これはおそらく、Visual Source Safeで見逃している唯一のものです...

現在、コードベース全体で最新を取得してWindows Searchを使用していますが、75,000ファイルに1 GBを超えるコードが含まれているため、非常に苦痛です。

編集:上記のpowertoolsを試しましたが、[ワイルドカード検索]オプションはファイル名のみを検索し、内容は検索しないようです。

更新:既存のMOSS(検索サーバー)インストールにカスタマイズされた検索オプションを実装しました。

回答:


57

Team Foundation Server 2015(オンプレミス)およびVisual Studio Team Services(クラウドバージョン)には、すべてのコードおよび作業項目を検索するための組み込みサポートが含まれています。

のような単純な文字列検索、のようなfooブール演算、foo OR barまたは次のようなより複雑な言語固有のものを実行できます。class:WebRequest

コード検索フィルター構文のスクリーンショット

詳しくは、https//www.visualstudio.com/en-us/docs/search/overviewをご覧ください。


2
以下の私の回答を参照して、賛成投票してください;)これは、Code Searchプラグインを使用することで、TFS 2015以降で可能になりました。marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

コード検索は現在、Visual Studio Team Servicesでのみ利用できます。Team Foundation Serverのサポートは開発中であり、次のリリースに含まれる予定です。
paparush

コード検索はTFS 2017以降で利用できるようになりました。
csrowell

そのドキュメントの2015バージョンに切り替えようとすると、「要求されたページはTeam Foundation Server 2015では使用できません。」
AaronLS

16

私の場合、C#で小さなユーティリティを作成すると役立ちました。参考になったリンク -http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

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

より魅力的であると思われる別の代替ソリューションがあります。

  1. 検索サーバーのセットアップ-任意のWindowsマシン/サーバー
  2. チェックインが発生するたびにファイルを取得、削除、更新するTFS通知サービス*(Bissubscribe)をセットアップします。つまり、これはTFSサーバー上のリスナーのように機能し、検索サーバー上のファイルとフォルダーを更新/同期するWebサービスです。- これにより、精度が劇的に向上し(ライブ検索)、定期的な取得を行うという1回限りの負荷が回避されます
  3. ルートフォルダーの検索サーバーでインデックスサービス/ Windowsインデックス検索を設定する
  4. Webサービスを公開して検索結果を返す

上記のすべての設定で、クライアントにはいくつかのオプションがあります。

  1. 検索サービスを呼び出して結果をフォーマットし、Webページに表示するようにWebページを設定します-このマクロをVisual Studio内に統合することもできます(マクロまたはアドインを使用)
  2. 検索サービスを呼び出して結果をフォーマットし、UIに表示するためのWindowsクライアントインターフェイス(winforms / wpf)を作成します。VSPackagesまたはアドインを介してこのクライアントツールをビジュアルスタジオ内に統合することもできます。

更新:私はこのルートに行きました、そしてそれはうまく働いています。これに追加したかっただけです。

参照リンク:

  1. bissubscribe.exeの代わりにこのツールを使用する
  2. TFSイベントの処理
  3. チームシステム通知

12

TFS 2008 PowerToolsをインストールすると、チームエクスプローラーの右クリックメニューに[ソース管理の検索]アクションが表示されます。

TFS2008パワーツール


4
@muerte彼らが「パワーツール」と呼ばれているのはおかしいです。ロールバックのようなことは「基本的な機能」だと言う人もいます。:-)
Iainホルダー

確かに、手動でロールバックを実行できます。これは、ワンクリックの操作ではありません。たぶんそれは..
ジェフ・アトウッド

3
良い答え、死んリンク: microsoft.com/downloads/...
WCM

15
私はファイル/フォルダ名のみを検索すると思います
キッド

9
-1パワーツールはファイルの内容を検索せず、ファイル/フォルダー名のみを検索します。
Eugene Beresovsky

6

Grantの提案と同様に、Team Foundation Server Source Control(言及したようにSourceSafeではありません)のソリューションをセットアップしました。スケジュールされたTF Get、Search Server Express。ただし、C#ファイル(テキスト)に使用されるIFilterは期待した結果を提供しなかったため、ソースファイルを.htmファイルに変換します。これで、次のようなファイルにメタデータを追加できます。

  • 作成者(ファイルで最後にチェックインした人と定義します)
  • 色分け(私たちのtodoリストに)
  • 潜在的な設計上の問題を示す変更の数(私たちのtodoリストにあります)
  • Koders SmartSearch機能のようなVSTS IDEと統合

ただし、TFSソース管理にはprotocolhandlerを、よりターゲットを絞ったソリューションには専用のソースコードIFilterを使用します。


1
.htm変換をオープンソースにする計画はありますか?
10

6

はい、

  1. TFS2008 Power Toolsには、ファイル内検索機能はありませ。「ソース管理で検索ツールを使用すると、アイテムのステータスまたはワイルドカード表現を使用して、ソース管理内のファイルとフォルダーを見つけることができます。」

  2. この機能を備えたWindowsプログラムがCodePlexに掲載されています。これをインストールしてテストしたところ、問題なく動作しました。


それは不安定で遅いですが、缶に書かれていることを実行しているようです
ポールマイケルズ

これらの人々が以下のリンクで取得したようなエラーが発生します。これを経験している人はいますか?tfssearchcode.codeplex.com/workitem/32475
ストライダー

6

これはTFS 2015以降、Code Searchプラグインを使用することで可能になりました。https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

検索はウェブインターフェースを介して行われ、ローカルマシンにコードをダウンロードする必要がないので便利です。


注:コード検索は現在、Visual Studio Team Servicesでのみ使用できます。Team Foundation Serverのサポートは開発中であり、次のリリースに含まれる予定です。
ジェイミー

3

別の解決策は「ctrl + shift + F」を使用することです。検索場所をソリューションやプロジェクトではなくローカルディレクトリに変更できます。これはデスクトップ検索の代わりになるだけで、最新のコードを取得する必要がありますが、Visual Studio内にとどまって検索を行うことができます。


4
TFSコードバージョンを検索する問題には対応していません。
クレイグ

彼らが望んでいたものではありません。
デイブ

ダウンロードしていないコンテンツは検索できません。grep / findstrを使用することもできます。
ジェイミー

2

Notepad ++があるとすると、よく見落とされる機能は「ファイルで検索」です。これは非常に高速で、フィルター、正規表現、置換、およびすべてのN ++の機能が付属しています。


1

このアドインは、あなたが求める機能を備えていると主張しています。

チーム財団サイドキック


ファイル内を検索できる場所がわかりませんか?
Mark Glorie、

4
いつもこのプラグインセットを先にダウンロードしましたが、作成者、ラベル、日付などで検索できますが、古いバージョンのファイル内では検索できません...:\
Sandor Davidhazi 2008年

1

このファイルリンクの検索では、ファイルを見つける方法について説明します。 私はそれを機能させるためにアドバイスをいじくらなければなりませんでした。

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

cdコマンドの場合、tf.exeファイルを探していたため、cdコマンドを実行しました。パス全体を追加するのではなく、そのディレクトリから開始する方が簡単でした。これを機能させる方法を理解したので、引用符で絶対パスを使用します。

tf検索の場合は、サーバーのルートから始めて、ie $/で終わるすべてのファイルを検索しました。ルートから始めたくない場合は、代わりに使用してください。sql*.sql"$/myproject/*.sql"

ああ!これは質問のファイル内検索の部分を解決しませんが、私のGoogle検索で他のリンクからファイルを見つけるためにここに連れて行ってくれました。


1

現時点ではこれを行う方法はありませんが、追加するためのユーザー音声の提案があります:http : //visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-作業項目の全文検索

スイッチを切り替えるのと同じくらい簡単なのではないかと思いますが、この質問を見た人全員がそれに投票した場合、MSはおそらく何かを実装するでしょう。

更新:ブライアンハリーのブログを読んでください。このリクエストはレーダーにあると示されています。また、Visual Studioのオンラインバージョンでは、gitがvcsとして使用されている場所を検索するためのサポートが制限されています:http ://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / announcing-limited-preview-for-visual-studio-online-code-search.aspx。このことから、時間の問題だと言っても差し支えないと思います...

更新2: Microsoftが提供する拡張機能であるコード検索が追加され、コード内および作業項目内を検索できるようになりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.