以编程方式将文件检入TFS的次数超出预期

时间:2009-03-26 20:23:47

标签: c# api tfs checkin working-directory


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

static string TFSProject = @"$/SQLScripts/";
static WorkspaceInfo wsInfo;
static VersionControlServer versionControl;
static string argPath = "E:\\SQLScripts\\";

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

Workspace workspace = versionControl.GetWorkspace(wsInfo);
workspace.GetLocalItemForServerItem(TFSProject);


此时我检查文件是否存在,我做了两件事之一。如果文件存在,那么我将文件标记为EDIT然后我将文件写入本地目录,否则我将首先编写脚本然后将文件添加到工作区。我不在乎物理文件是否与我生成的文件相同,因为我这样做是为了跟踪SAS70“跟踪更改”的要求 如果它存在我做:
workspace.PendEdit(文件名,RecurisionType.Full);
scriptoutthefile(文件名);

或者如果不存在的话 scriptoutthefilename(文件名);
workspace.PendAdd(文件名,TRUE);

好的,所有这一切都可以解决问题。当我去检查针对PROJECT的挂起更改时,我得到了工作区中本地计算机上所有项目的所有挂起更改。

// Show our pending changes. 
PendingChange[] pendingChanges = workspace.GetPendingChanges();
foreach (PendingChange pendingChange in pendingChanges)
{
    dosomething...
}

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

是否有办法强制工作空间对象只处理特定的工作文件夹?

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

3 个答案:

答案 0 :(得分:5)

使用LINQ,您可以获得特定文件夹

的挂起更改
PendingChange[] pendingChanges = workspace
    .GetPendingChanges()
    .Where(x => x.LocalOrServerFolder.Contains(argPath))
    .ToArray();

答案 1 :(得分:2)

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

tf workspaces / s:http://SomeTFSServer:8080/

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

答案 2 :(得分:1)

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

SET AppDataTF=%USERPROFILE%\Local Settings\Application Data\Microsoft\Team Foundation
SET AppDataVS=%APPDATA%\Microsoft\VisualStudio
IF EXIST "%AppDataTF%\1.0\Cache" rd /s /q "%AppDataTF%\1.0\Cache" > NUL
IF EXIST "%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项目和本地文件夹的辅助工作区,所有内容都像魅力一样。

也许别人会觉得这很有用......