Dosyalarda Bul: Team Foundation Server'daki tüm kodu arayın


102

Belirli bir dize veya normal ifade için TFS'deki her dosyanın en son sürümünü aramanın bir yolu var mı? Bu muhtemelen Visual Source Safe'ten özlediğim tek şey ...

Şu anda kod tabanının tamamında En Son Alını yapıyorum ve Windows Arama kullanıyorum, ancak 75.000 dosyada 1 GB'den fazla kodla bu oldukça acı verici oluyor.

DÜZENLEME : Bahsedilen powertools denendi, ancak "Joker Karakterle Arama" seçeneği içeriklerde değil, sadece dosya adlarında arama yapmak için görünüyor.

GÜNCELLEME : Mevcut bir MOSS (Arama Sunucusu) kurulumunda özelleştirilmiş bir arama seçeneği uyguladık.

Yanıtlar:


57

Team Foundation Server 2015 (şirket içi) ve Visual Studio Team Services (bulut sürümü), tüm kodunuzda ve çalışma öğelerinizde arama yapmak için yerleşik destek içerir.

fooBoole işlemleri gibi basit dize aramaları foo OR barveya daha karmaşık dile özgü şeyler yapabilirsiniz.class:WebRequest

kod arama filtresi sözdiziminin ekran görüntüsü

Bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz: https://www.visualstudio.com/en-us/docs/search/overview


2
Aşağıdaki cevabıma bakın ve oy verin;) Bu, Code Searcheklenti kullanılarak TFS 2015 itibariyle artık mümkün . marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

Code Search şu anda yalnızca Visual Studio Team Services için kullanılabilir. Team Foundation Server desteği geliştirme aşamasındadır ve bir sonraki sürüme dahil edilecektir.
paparush

Kod Arama artık TFS 2017 veya daha yeni sürümlerde kullanılabilir.
csrowell

Bu belgenin 2015 sürümüne geçmeye çalışırsanız: "İstenen sayfa Team Foundation Server 2015 için mevcut değil."
AaronLS

16

Benim durumumda, C # ile küçük bir yardımcı program yazmak yardımcı oldu. Bana yardımcı olan bağlantılar - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Tfs api kullanarak bir ekip projesinin dosyaları nasıl listelenir?

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

Daha çekici görünen başka bir alternatif çözüm var.

  1. Bir arama sunucusu kurun - herhangi bir Windows makinesi / sunucusu olabilir
  2. Her giriş yapıldığında dosyaları almak, silmek ve güncellemek için bir TFS bildirim hizmeti * (Bissubscribe) kurun. Dolayısıyla bu, TFS sunucusunda bir dinleyici gibi davranan ve Arama sunucusundaki dosya ve klasörleri güncelleyen / senkronize eden bir web hizmetidir. - bu, doğruluğu (canlı arama) önemli ölçüde artıracak ve periyodik alımların tek seferlik yükünü önleyecektir.
  3. Kök klasör için Arama sunucusunda bir indeksleme hizmeti / Windows indeksli arama ayarlayın
  4. Arama sonuçlarını döndürmek için bir web hizmeti sunun

Şimdi, yukarıdaki tüm kurulumla, müşteri için birkaç seçeneğiniz var:

  1. Arama hizmetini çağırmak ve sonuçları web sayfasında gösterilecek şekilde biçimlendirmek için bir web sayfası kurun - bu web sayfasını visual studio (bir makro veya eklenti aracılığıyla) da entegre edebilirsiniz.
  2. Arama hizmetini çağırmak ve sonuçları biçimlendirmek ve kullanıcı arayüzünde göstermek için bir Windows istemci arayüzü (winforms / wpf) oluşturun - bu istemci aracını VSPackages veya eklenti yoluyla visual studio içine de entegre edebilirsiniz.

Güncelleme : Bu rotaya gittim ve güzel çalışıyor. Sadece buna eklemek istedim.

Referans bağlantıları:

  1. Bissubscribe.exe yerine bu aracı kullanın
  2. TFS olaylarını işleme
  3. Takım Sistem Bildirimleri

12

TFS 2008 PowerTools'u kurarsanız, Takım Gezgini sağ tıklama menüsünde bir "Kaynak Kontrolünde Bul" eylemi alırsınız.

TFS2008 Elektrikli El Aletleri


4
@muerte onlara 'elektrikli aletler' denmesi komik. Bazıları geri alma gibi bir şey yapmanın 'temel işlev' olduğunu söyleyebilir. :-)
Iain Holder

Pekala, kesinlikle manuel olarak bir geri alma işlemi yapabilirsiniz, bu sadece tek tıklamayla yapılan bir işlem değildir. Belki de öyle olmalı ..
Jeff Atwood

3
İyi cevap, çalışmayan bağlantı: microsoft.com/downloads/…
wcm

15
bence sadece dosya / klasör adını arar
Kiddo

9
-1 elektrikli aletler dosya içeriğini aramaz , yalnızca dosya / klasör adlarını arar .
Evgeniy Berezovsky

6

Grant'in önerdiğine benzer bir Team Foundation Server Kaynak Kontrolü (sizin belirttiğiniz gibi SourceSafe değil) için bir çözüm geliştirdik; planlanmış TF Get, Arama Sunucusu Express. Ancak C # dosyaları (metin) için kullanılan IFilter istediğimiz sonuçları vermiyordu, bu nedenle kaynak dosyaları .htm dosyalarına dönüştürdük. Artık dosyalara aşağıdaki gibi ek meta veriler ekleyebiliriz:

  • Yazar (dosyayı en son kontrol eden kişi olarak tanımlarız)
  • Renk kodlaması (yapılacaklar listemizde)
  • Olası tasarım sorunlarını gösteren değişiklik sayısı (yapılacaklar listemizde)
  • Koders SmartSearch özelliği gibi VSTS IDE ile entegre edin
  • vb.

Bununla birlikte, TFS Kaynak Kontrolü için bir protokol işleyiciyi ve çok daha hedefli bir çözüm için özel bir kaynak kodu IFilter'ı tercih ederiz.


1
.Htm dönüşümünü açık kaynak olarak yapmayı planlıyor musunuz?
technomalogical

6

Tamam,

  1. TFS2008 Elektrikli El Aletleri do not a bulmak-in-dosyaları fonksiyonu var. "Kaynak Denetiminde Bul araçları, kaynak denetimindeki dosya ve klasörleri öğenin durumuna göre veya bir joker karakter ifadesiyle bulma yeteneği sağlar ."

  2. CodePlex'te yayınlanan bu işlevselliğe sahip bir Windows programı var . Bunu yeni kurdum ve test ettim ve iyi çalışıyor.


Kesintili ve yavaş, ancak teneke üzerinde yazdığı şeyi yapıyor gibi görünüyor
Paul Michaels

Bu kişilerin aşağıdaki bağlantıda olduğu gibi bir hata alıyorum. Bunu yaşayan başka biri var mı? tfssearchcode.codeplex.com/workitem/32475
strider


3

Diğer bir çözüm ise "ctrl + shift + F" kullanmaktır. Arama konumunu bir çözüm veya proje yerine yerel bir dizin olarak değiştirebilirsiniz. Bu sadece masaüstü aramasının yerini alacak ve yine de en son kodu almanız gerekecek, ancak aramanızı yapmak için Visual Studio'da kalmanıza izin verecektir.


4
TFS kod sürümleri aracılığıyla arama sorununu çözmez.
Craig

İstedikleri değil.
Dave

İndirmediğiniz içerikleri aramak için gereksiz. Grep / findstr kullanabilirsiniz.
Jamie

2

Notepad ++ 'ya sahip olduğunuzu varsayarsak , sıklıkla gözden kaçan bir özellik, son derece hızlı olan ve filtreler, normal ifadeler, değiştirme ve tüm N ++ güzellikleriyle birlikte gelen' Dosyalarda bul'dur.


1

Bu eklenti, aradığınızı düşündüğüm işlevselliğe sahip olduğunu iddia ediyor:

Takım Vakfı Sidekicks


Maalesef dosyaların içinde arama yapmayı önerdiği yeri göremiyorum?
Mark Glorie

4
Başlangıçta bu eklenti setini daha önce indirmiştim ve yalnızca yazara, etikete, tarihe vb. Göre arama yapmanıza izin veriyor, ancak dosyaların eski sürümlerinde değil ...: \
Sandor Davidhazi

1

Bu dosya bağlantısı araması, bir dosyanın nasıl bulunacağını açıklar. İşe yaraması için tavsiyeyle uğraşmak zorunda kaldım.

  1. cd "C: \ Program Dosyaları (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE"
  2. tf dir "$ / *. sql" / özyinelemeli / sunucu: http: // mytfsserver: 8080 / tfs

Cd komutu durumunda, cd komutunu uyguladım çünkü tf.exe dosyasını arıyordum. Tüm yolu ekleyerek bu dizinden başlamak daha kolaydı. Artık bunu nasıl çalıştıracağımı anladığıma göre, alıntılarda mutlak yolu kullanacağım.

Tf araması durumunda sunucunun kök dizininde ie $/ile biten tüm dosyaları aradım . Kökten başlamak istemiyorsanız, onun yerine kullanın.sql*.sql"$/myproject/*.sql"

Oh! Bu, sorunun dosya kısmında aramayı çözmez, ancak Google aramam beni buraya diğer bağlantıların yanı sıra dosyaları bulmaya getirdi.


1

Şu anda bunu kutudan çıkarmanın bir yolu yoktur, ancak eklemek için bir Kullanıcı Sesi önerisi var: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- iş öğelerinin tam metin araması

Bir anahtarı çevirmek kadar basit olduğundan kuşkuluysam da, bu soruyu gören herkes ona oy verseydi, MS muhtemelen bir şeyler uygulayacaktır.

Güncelleme: Brian Harry'nin bu isteği kendi radarlarında olduğunu gösteren blogunu okuyun ve Visual Studio'nun Çevrimiçi sürümü git'in vcs olarak kullanıldığı yerlerde arama için sınırlı desteğe sahiptir: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / görsel-stüdyo-çevrimiçi-kod-araması için-sınırlı-önizleme-duyurusu . Bundan sadece bir zaman meselesi olduğunu söylemek doğru olur ...

Güncelleştirme 2: Artık Microsoft tarafından sağlanan ve kodda ve iş öğelerinde aramayı sağlayan Code Search adlı bir uzantı var .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.