ค้นหาในไฟล์: ค้นหาโค้ดทั้งหมดใน Team Foundation Server


102

มีวิธีค้นหาเวอร์ชันล่าสุดของทุกไฟล์ใน TFS สำหรับสตริงหรือนิพจน์เฉพาะหรือไม่ นี่อาจเป็นสิ่งเดียวที่ฉันพลาดจาก Visual Source Safe ...

ขณะนี้ฉันทำการ Get Latest บน codebase ทั้งหมดและใช้ Windows Search แต่สิ่งนี้ค่อนข้างเจ็บปวดเมื่อมีโค้ดมากกว่า 1GB ในไฟล์ 75,000 ไฟล์

แก้ไข : ลองใช้เครื่องมือที่กล่าวถึงแล้ว แต่ตัวเลือก "Wildcard Search" ปรากฏขึ้นเพื่อค้นหาเฉพาะชื่อไฟล์ไม่ใช่เนื้อหา

อัปเดต : เราได้ใช้ตัวเลือกการค้นหาแบบกำหนดเองในการติดตั้ง MOSS (Search Server) ที่มีอยู่

คำตอบ:


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
ดูคำตอบของฉันด้านล่างและโหวตให้คะแนน;) ตอนนี้สามารถทำได้ใน TFS 2015 โดยใช้Code Searchปลั๊กอิน marketplace.visualstudio.com/items?itemName=ms.vss-code-search
Deadlydog

ขณะนี้ Code Search มีให้บริการเฉพาะ Visual Studio Team Services การสนับสนุนสำหรับ Team Foundation Server อยู่ระหว่างการพัฒนาและจะรวมอยู่ในรุ่นถัดไป
paparush

Code Search พร้อมให้บริการแล้วใน 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 และอัปเดต / ซิงค์ไฟล์และโฟลเดอร์บนเซิร์ฟเวอร์การค้นหา - สิ่งนี้จะช่วยปรับปรุงความแม่นยำได้อย่างมาก (การค้นหาสด) และหลีกเลี่ยงการโหลดครั้งเดียวในการทำให้เป็นระยะ ๆ
  3. ตั้งค่าบริการการทำดัชนี / การค้นหาที่จัดทำดัชนีของ windows บนเซิร์ฟเวอร์การค้นหาสำหรับโฟลเดอร์ราก
  4. แสดงบริการเว็บเพื่อแสดงผลการค้นหา

ขณะนี้ด้วยการตั้งค่าทั้งหมดข้างต้นคุณมีตัวเลือกสำหรับไคลเอนต์:

  1. ตั้งค่าหน้าเว็บเพื่อเรียกใช้บริการค้นหาและจัดรูปแบบผลลัพธ์เพื่อแสดงบนหน้าเว็บ - คุณยังสามารถรวมหน้าเว็บนี้ไว้ใน Visual Studio (ผ่านมาโครหรือ Add-in)
  2. สร้างอินเทอร์เฟซไคลเอนต์ windows (winforms / wpf) เพื่อเรียกใช้บริการค้นหาและจัดรูปแบบผลลัพธ์และแสดงบน UI - คุณยังสามารถรวมเครื่องมือไคลเอนต์นี้ไว้ในวิชวลสตูดิโอผ่าน VSPackages หรือ Add-in

อัปเดต : ฉันไปเส้นทางนี้และทำงานได้ดี แค่อยากจะเพิ่มสิ่งนี้

ลิงค์อ้างอิง:

  1. ใช้เครื่องมือนี้แทน bissubscribe.exe
  2. การจัดการเหตุการณ์ TFS
  3. การแจ้งเตือนระบบทีม

12

หากคุณติดตั้ง TFS 2008 PowerTools คุณจะได้รับการดำเนินการ "Find in Source Control" ในเมนูคลิกขวาของ Team Explorer

TFS2008 เครื่องมือไฟฟ้า


4
@muerte เป็นเรื่องตลกที่พวกเขาเรียกว่า 'เครื่องมือไฟฟ้า' บางคนบอกว่าการทำบางอย่างเช่นการย้อนกลับเป็น 'ฟังก์ชันพื้นฐาน' :-)
Iain Holder

แน่นอนคุณสามารถทำการย้อนกลับได้ด้วยตนเองไม่ใช่แค่การดำเนินการเพียงคลิกเดียว บางทีมันควรจะเป็น ..
Jeff Atwood

3
ตอบดีลิงค์ตาย: microsoft.com/downloads/…
wcm

15
ฉันคิดว่าค้นหาเฉพาะชื่อไฟล์ / โฟลเดอร์
Kiddo

9
-1 เครื่องมือไฟฟ้าไม่ค้นหาเนื้อหาไฟล์เฉพาะชื่อไฟล์ / โฟลเดอร์
Eugene Beresovsky

6

เราได้ตั้งค่าโซลูชันสำหรับ Team Foundation Server Source Control (ไม่ใช่ SourceSafe ตามที่คุณกล่าวถึง) คล้ายกับที่ Grant แนะนำ กำหนด TF Get, Search Server Express อย่างไรก็ตาม IFilter ที่ใช้สำหรับไฟล์ C # (ข้อความ) ไม่ได้ให้ผลลัพธ์ที่เราต้องการดังนั้นเราจึงแปลงไฟล์ต้นฉบับเป็นไฟล์. htm ตอนนี้เราสามารถเพิ่ม meta-data เพิ่มเติมให้กับไฟล์เช่น:

  • ผู้เขียน (เรากำหนดเป็นบุคคลที่ตรวจสอบไฟล์ครั้งล่าสุด)
  • การเข้ารหัสสี (ในรายการสิ่งที่ต้องทำของเรา)
  • จำนวนการเปลี่ยนแปลงที่บ่งชี้ปัญหาการออกแบบที่อาจเกิดขึ้น (ในรายการสิ่งที่ต้องทำของเรา)
  • ผสานรวมกับ VSTS IDE เช่นคุณสมบัติ Koders SmartSearch
  • เป็นต้น

อย่างไรก็ตามเราต้องการตัวจัดการโปรโตคอลสำหรับ TFS Source Control และ IFilter ซอร์สโค้ดเฉพาะสำหรับโซลูชันที่ตรงเป้าหมายมากขึ้น


1
มีแผนจะเปิดแหล่งที่มาของการแปลง. htm หรือไม่
technomalogical

6

ตกลง,

  1. TFS2008 Power Tools ไม่มีฟังก์ชันค้นหาในไฟล์ "เครื่องมือ Find in Source Control ให้ความสามารถในการค้นหาไฟล์และโฟลเดอร์ในการควบคุมแหล่งที่มาตามสถานะของรายการหรือด้วยนิพจน์ตัวแทน "

  2. มีโปรแกรม Windows ด้วยฟังก์ชันการทำงานนี้โพสต์เมื่อเป็นCodePlex ฉันเพิ่งติดตั้งและทดสอบสิ่งนี้และใช้งานได้ดี


มันไม่สม่ำเสมอและช้า แต่ดูเหมือนจะทำตามที่พูดไว้ในกระป๋อง
Paul Michaels

ฉันได้รับข้อผิดพลาดเช่นเดียวกับบุคคลเหล่านี้ในลิงก์ด้านล่าง มีใครประสบปัญหานี้อีกไหม tfssearchcode.codeplex.com/workitem/32475
strider

6

ตอนนี้สามารถทำได้ใน TFS 2015 โดยใช้Code Searchปลั๊กอิน https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

การค้นหาทำได้ผ่านทางเว็บอินเทอร์เฟซและไม่จำเป็นต้องให้คุณดาวน์โหลดรหัสลงในเครื่องของคุณซึ่งเป็นสิ่งที่ดี


หมายเหตุ: ปัจจุบันการค้นหาโค้ดพร้อมใช้งานสำหรับ Visual Studio Team Services เท่านั้น การสนับสนุนสำหรับ Team Foundation Server อยู่ระหว่างการพัฒนาและจะรวมอยู่ในรุ่นถัดไป
Jamie

3

อีกวิธีหนึ่งคือการใช้ "ctrl + shift + F" คุณสามารถเปลี่ยนตำแหน่งการค้นหาเป็นโลคัลไดเร็กทอรีแทนที่จะเป็นโซลูชันหรือโปรเจ็กต์ สิ่งนี้จะเข้ามาแทนที่การค้นหาบนเดสก์ท็อปและคุณยังต้องได้รับรหัสล่าสุด แต่จะช่วยให้คุณอยู่ใน Visual Studio เพื่อทำการค้นหาของคุณ


4
ไม่ได้แก้ไขปัญหาการค้นหาผ่านเวอร์ชันรหัส TFS
Craig

ไม่ใช่สิ่งที่พวกเขาต้องการ
Dave

ไม่มีประโยชน์สำหรับการค้นหาเนื้อหาที่คุณไม่ได้ดาวน์โหลด อาจใช้ grep / findstr เช่นกัน
Jamie

2

สมมติว่าคุณมีNotepad ++คุณสมบัติที่พลาดบ่อยคือ 'ค้นหาในไฟล์' ซึ่งเร็วมากและมาพร้อมกับตัวกรองนิพจน์ทั่วไปแทนที่และสารพัด N ++ ทั้งหมด


1

Add-in นี้อ้างว่ามีฟังก์ชันที่ฉันเชื่อว่าคุณต้องการ:

ทีม Foundation Sidekicks


ขออภัยฉันไม่เห็นว่ามีให้ค้นหาไฟล์ภายในที่ไหน?
Mark Glorie

4
ในตอนนี้ฉันดาวน์โหลดชุดปลั๊กอินนี้มาก่อนหน้านี้และอนุญาตให้คุณค้นหาโดยผู้เขียนป้ายกำกับวันที่ ฯลฯ เท่านั้น แต่ไม่สามารถค้นหาได้ในไฟล์เวอร์ชันเก่า ... : \
Sandor Davidhazi

1

การค้นหาลิงก์ไฟล์นี้จะอธิบายวิธีค้นหาไฟล์ ฉันต้องยุ่งกับคำแนะนำเพื่อให้มันใช้งานได้

  1. cd "C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE"
  2. tf dir "$ / *. sql" / recursive / เซิร์ฟเวอร์: http: // mytfsserver: 8080 / tfs

ในกรณีของคำสั่ง cd ฉันใช้คำสั่ง cd เพราะฉันกำลังมองหาไฟล์ tf.exe มันง่ายกว่าที่จะเริ่มจากข้อของไดเรกทอรีนั้นโดยเพิ่มเส้นทางทั้งหมด ตอนนี้ฉันเข้าใจวิธีทำงานนี้แล้วฉันจะใช้เส้นทางสัมบูรณ์ในเครื่องหมายคำพูด

ในกรณีของการค้นหา TF ผมเริ่มที่รากของเซิร์ฟเวอร์ที่มี$/และผมค้นหาไฟล์ทั้งหมดที่จบลงด้วยเช่นsql *.sqlหากคุณไม่ต้องการเริ่มต้นที่รากให้ใช้"$/myproject/*.sql"แทน

โอ้! สิ่งนี้ไม่ได้แก้ปัญหาการค้นหาในไฟล์ส่วนหนึ่งของคำถาม แต่การค้นหาโดย Google ของฉันทำให้ฉันมาที่นี่เพื่อค้นหาไฟล์ในลิงก์อื่น ๆ


1

ขณะนี้ยังไม่มีวิธีทำสิ่งนี้นอกกรอบ แต่มีคำแนะนำเกี่ยวกับเสียงของผู้ใช้สำหรับการเพิ่ม: 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 จากนี้ฉันคิดว่ามันยุติธรรมที่จะบอกว่ามันเป็นเพียงเรื่องของเวลา ...

อัปเดต 2:ขณะนี้มีส่วนขยายที่ Microsoft จัดเตรียมไว้คือCode Searchซึ่งช่วยให้สามารถค้นหาในโค้ดและในรายการงานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.