102

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

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

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

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

4

12 に答える 12

60

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

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

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

詳細については、https ://www.visualstudio.com/en-us/docs/search/overview をご覧ください。

于 2008-09-17T01:34:39.647 に答える
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;
    }
}
}
于 2014-04-11T22:10:23.730 に答える
13

より魅力的な別の代替ソリューションがあります。

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

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

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

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

参照リンク:

  1. bissubscribe.exe の代わりにこのツールを使用してください
  2. TFS イベントの処理
  3. チーム システムの通知
于 2009-04-06T17:45:24.030 に答える
10

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

TFS2008 電動工具

于 2008-09-03T10:11:35.577 に答える
6

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

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

ただし、TFS ソース管理にはプロトコル ハンドラを使用し、より対象を絞ったソリューションには専用のソース コード IFilter を使用することをお勧めします。

于 2008-09-21T08:57:25.980 に答える
6

わかった、

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

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

于 2009-06-12T19:48:00.707 に答える
3

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

于 2008-12-17T20:48:18.217 に答える
1

このファイル リンクの検索では、ファイルの検索方法について説明します。 私はそれを機能させるためにアドバイスをいじる必要がありました。

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

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

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

おー!これは質問のファイル部分での検索を解決しませんが、私のGoogle検索では、他のリンクの中からファイルを見つけるためにここに来ました。

于 2016-09-24T01:33:51.210 に答える
1

Notepad++を持っていると仮定すると、見逃されがちな機能は「ファイル内を検索」です。これは非常に高速で、フィルター、正規表現、置換、およびすべての N++ グッズが付属しています。

于 2016-11-03T10:47:33.620 に答える
1

現在、これをすぐに実行する方法はありませんが、それを追加するための User Voice の提案があります: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-作品の全文検索

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

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

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

于 2015-09-30T00:35:33.810 に答える
0

This add-in claims to have the functionality that I believe you seek:

Team Foundation Sidekicks

于 2008-10-16T20:24:32.377 に答える