4


所以我有一个 .NET 应用程序,它通过并生成一系列文件,将它们输出到本地目录,然后确定是否需要更新现有文件或将新文件添加到 TFS(Team Foundation Server)项目中。
我的本地机器上有一个工作区,并且有 10 个不同的工作文件夹,这些文件夹是我在这台特定机器上从事的其他编码项目。当我去检查文件是否已经存在于 TFS 项目中并且需要更新或者是否需要作为新文件添加到项目中时,就会出现我的问题。
片段:

静态字符串 TFSProject = @"$/SQLScripts/";
静态 WorkspaceInfo wsInfo;
静态版本控制服务器版本控制;
静态字符串 argPath = "E:\\SQLScripts\\";

wsInfo = Workstation.Current.GetLocalWorkspaceInfo(argPath);
TeamFoundationServer tfs = new TeamFoundationServer(wsInfo.ServerUri.AbsoluteUri);
versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

工作区工作区 = versionControl.GetWorkspace(wsInfo);
workspace.GetLocalItemForServerItem(TFSProject);


此时,我检查文件是否存在,然后做两件事之一。如果文件存在,那么我将文件标记为 EDIT,然后将文件写出到本地目录,否则我将先编写文件脚本,然后将文件添加到工作区。我不在乎物理文件是否与我正在生成的文件相同,因为我这样做是作为“跟踪更改”的 SAS70 要求

如果它存在,我会这样做:
workspace.PendEdit(filename,RecurisionType.Full);
脚本输出文件(文件名);

或者如果它不存在
scriptoutthefilename(filename);
workspace.PendAdd(filename,true);

好的,所有这些都是为了解决问题。当我去检查针对 PROJECT 的未决更改时,我会获得工作区中本地计算机上所有项目的所有未决更改。

// 显示我们挂起的更改。
PendingChange[] pendingChanges = workspace.GetPendingChanges();
foreach (PendingChanges 中的pendingChanges)
{
    做点什么...
}

我认为通过将工作区设置为 workspace.GetLocalItemForServerItem(TFSProject) 它只会为我提供该特定工作文件夹的对象。

如果有什么方法可以强制工作区对象只处理特定的工作文件夹?

这有什么意义吗?提前致谢...

4

3 回答 3

5

使用 LINQ,您可以获得特定文件夹的待处理更改

PendingChange[] pendingChanges = workspace
    .GetPendingChanges()
    .Where(x => x.LocalOrServerFolder.Contains(argPath))
    .ToArray();
于 2010-08-10T13:17:15.037 回答
2

这是刷新工作区缓存的另一种方法:

tf 工作区/s:http://SomeTFSServer:8080/

此外,Workspace 有一个名为 UpdateWorkspaceInfoCache(..) 的方法,它似乎做同样的事情。不过,我还没有测试过。

于 2009-05-27T18:14:33.183 回答
1

好的,事实证明我的机器上有一个损坏的 TFS 工作区缓存。这是解决方案(来自命令提示符):

SET AppDataTF=%USERPROFILE%\Local Settings\Application Data\Microsoft\Team Foundation
SET AppDataVS=%APPDATA%\Microsoft\VisualStudio
如果存在 "%AppDataTF%\1.0\Cache" rd /s /q "%AppDataTF%\1.0\Cache" > NUL
如果存在 "%AppDataTF%\2.0\Cache" rd /s /q "%AppDataTF%\2.0\Cache" > NUL
IF EXIST "%AppDataVS%\8.0\Team Explorer" rd /s /q "%AppDataVS%\8.0\Team Explorer" > NUL
IF EXIST "%AppDataVS%\9.0\Team Explorer" rd /s /q "%AppDataVS%\9.0\Team Explorer" > NUL

问题的另一部分是,通过将项目文件夹放在同一个工作区中,它将从其他项目中提取所有待处理的更改。我创建了一个只有 SQLScripts 项目和本地文件夹的辅助工作区,一切都像一个魅力。

也许其他人会发现这很有用...

于 2009-03-31T20:31:19.273 回答