在文件中查找:searchTeam Foundation Server中的所有代码
有没有一种方法来searchTFS中的每个文件的最新版本的特定string或正则expression式? 这可能是我从Visual Source Safe中错过的唯一的东西。
目前,我在整个代码库上执行Get Latest,并使用Windows Search,但是在75,000个文件中超过1GB的代码会变得非常痛苦。
编辑 :试图提到powertools,但“通配符search”选项似乎只search文件名,而不是内容。
更新 :我们已经在现有的MOSS(search服务器)安装中实现了一个定制的search选项。
Team Foundation Server 2015(本地)和Visual Studio Team Services(云版本)包含内置的支持,以便在所有代码和工作项目中进行search。
你可以做像foo
这样简单的stringsearch,像foo OR bar
这样的布尔运算,或者更复杂的特定于语言的事情,比如class:WebRequest
你可以在这里阅读更多关于它的信息: https : //www.visualstudio.com/en-us/docs/search/overview
如果您安装了TFS 2008 PowerTools,您将在Team Explorer右键菜单中获得“在源代码pipe理中查找”操作。
TFS2008电动工具
还有另外一种解决办法,似乎更有吸引力。
- 设置一个search服务器 – 可以是任何Windows机器/服务器
- 设置一个TFS通知服务* (Bissubscribe)来获取,删除,更新文件,每次签入发生。 所以这是一个Web服务,它像TFS服务器上的监听器一样工作,并更新/同步search服务器上的文件和文件夹。 – 这将大大提高准确度(实时search),并避免一次性定期获取负载
- 在search服务器上为根文件夹设置索引服务/ Windows索引search
- 公开Web服务以返回search结果
现在完成上述设置,您可以为客户端提供几个选项:
- 设置一个网页来调用search服务,并将结果格式化以显示在网页上 – 还可以将此网页集成到Visual Studio中(通过macros或加载项)
- 创build一个Windows客户端接口(winforms / wpf)来调用search服务并格式化结果并在用户界面上显示它们 – 还可以通过VSPackages或加载项将这个客户端工具集成到visual studio中
更新 :我确实走了这条路,而且一直很好。 只是想补充一点。
参考链接:
- 使用这个工具,而不是bissubscribe.exe
- 处理TFS事件
- 团队系统通知
在我的情况下,在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")); 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; } } }
我们已经为Team Foundation服务器源代码pipe理(不是SourceSafe)提供了类似于Grant所build议的解决scheme; 预定TF Get,Search Server Express。 然而,用于C#文件(文本)的IFilter没有提供我们想要的结果,所以我们将源文件转换为.htm文件。 我们现在可以向文件添加额外的元数据,例如:
- 作者(我们将其定义为上次在文件中签入的人员)
- 颜色编码(在我们的todo名单上)
- 显示潜在devise问题的更改数量(在我们的待办事项列表中)
- 与Koders SmartSearchfunction集成VSTS IDE
- 等等
然而,我们宁愿使用TFS源代码控制的协议处理程序,也不要使用专门的源代码IFilter来获得更有针对性的解决scheme。
好的,
-
TFS2008电动工具没有查找文件function。 “在源代码pipe理工具中查找可以通过项目状态或通配符expression式来查找源代码pipe理中的文件和文件夹。”
-
在CodePlex上发布了一个具有此function的Windows程序。 我只是安装和testing这个,它运作良好。
通过使用Code Search
插件,现在可以使用TFS 2015。 https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search
search是通过网页界面完成的,并不要求您将代码下载到本地机器上,这很好。
另一个解决scheme是使用“Ctrl + Shift + F”。 您可以将search位置更改为本地目录而不是解决scheme或项目。 这只是取代桌面search,您仍然需要获取最新的代码,但是它可以让您保留在Visual Studio中进行search。
此加载项声称具有我相信您所寻求的function:
Team Foundation Sidekicks
目前没有办法做到这一点,但有一个用户语音build议添加它: http : //visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-全文检索用的工作项
虽然我怀疑这是否像转换开关一样简单,如果每个人都看过这个问题投了赞成票,MS可能会实现一些东西。
更新:刚刚阅读Brian Harry的博客 ,显示这个请求是在他们的雷达,在线版本的Visual Studio有限的支持searchgit用作vcs: http : //blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / announcing-limited-preview-for-visual-studio-online-code-search.aspx 。 从这我认为这是公平的说这只是一个时间问题…
这个search文件链接解释了如何find一个文件。 我确实必须仔细考虑这个build议才能使之工作。
- cd“C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE”
- tf dir“$ / *。sql”/ recursive / server: http:// mytfsserver:8080 / tfs
在cd命令的情况下,我执行了cd命令,因为我正在查找tf.exe文件。 从这个目录开始join整个path比较容易。 现在,我明白如何使这个工作,我会用引号中的绝对path。
在tfsearch的情况下,我用$/
开始在服务器的根目录下,我search所有以sql
ie *.sql
结尾的文件。 如果你不想从根开始,那么改用"$/myproject/*.sql"
。
哦! 这不能解决在问题的文件部分search,但我的谷歌search带我到这里find其他链接中的文件。
假设你有Notepad ++ ,一个经常被忽略的function是“在文件中查找”,这是非常快的,并带有filter,正则expression式,replace和所有的N ++好东西。