質問

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

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

編集:上記のパワーツールを試してみましたが、「ワイルドカード検索」オプションではファイル名のみが検索され、コンテンツは検索されないようです。

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

役に立ちましたか?

解決

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

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

screenshot of code search filter syntax

詳細については、ここで読むことができます。 https://www.visualstudio.com/en-us/docs/search/overview

他のヒント

私の場合は、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;
    }
}
}

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

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

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

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

アップデート:私はこの方法を採用しましたが、うまくいきました。これに追加したかっただけです。

参考リンク:

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

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

TFS2008 電動工具

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

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

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

わかった、

  1. TFS2008 電動工具は次のことを行います ない ファイル内検索機能があります。「ソース管理内検索ツールは、アイテムのソース管理内でファイルとフォルダーを検索する機能を提供します。 状態 または ワイルドカード 表現。"

  2. この機能を備えた Windows プログラムが投稿されています。 コードプレックス. 。これをインストールしてテストしたところ、うまく動作しました。

これは、TFS 2015 以降、 Code Search プラグイン。 https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

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

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

このアドインには、あなたが求めていると思われる機能があると主張されています。

チーム財団のサイドキック

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

  1. cd "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE"
  2. tf ディレクトリ "$/*.sql" /recursive /server:http://mytfsserver:8080/tfs

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

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

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

持っていると仮定すると、 メモ帳++, 、見逃されがちな機能は「ファイル内検索」です。これは非常に高速で、フィルター、正規表現、置換などの N++ 機能がすべて備わっています。

現時点ではこれをそのまま実行する方法はありませんが、これを追加するための User Voice の提案があります。 http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

スイッチを入れるだけの簡単なことではないと思いますが、この質問を見た人全員が投票したのであれば、MS はおそらく何かを実装するでしょう。

アップデート:読むだけ ブライアン・ハリーのブログ, これは、この要求がレーダー上にあることを示しており、Visual Studio のオンライン バージョンでは、git が vcs として使用されている場所の検索のサポートが制限されています。 http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/13/payment-limited-preview-for-visual-studio-online-code-search.aspx. 。このことから、それは時間の問題であると言っても過言ではないと思います...

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top