Программная проверка файлов в TFS, получая больше, чем ожидалось
Итак, у меня есть приложение.NET, которое анализирует и генерирует серию файлов, выводит их в локальный каталог и затем определяет, нужно ли ему обновить существующий файл или добавить новый файл в проект TFS (Team Foundation Server).
У меня есть одно рабочее пространство на локальном компьютере, и есть 10 различных рабочих папок, которые являются другими проектами кодирования, над которыми я работал с этой конкретной машины. Моя проблема возникает, когда я проверяю, существует ли файл в проекте TFS и требуется ли обновление или его нужно добавить в проект в качестве нового файла.
snipet:
статическая строка TFSProject = @"$/SQLScripts/"; static WorkspaceInfo wsInfo; static VersionControlServer versionControl; статическая строка 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 (имя файла, правда);
Хорошо, все это, чтобы добраться до проблемы. Когда я проверяю ожидающие изменения в PROJECT, я получаю все ожидающие изменения для всех проектов, которые есть на моей локальной машине в рабочей области.
// Показать наши ожидающие изменения. PendingChange[] pendingChanges = workspace.GetPendingChanges(); foreach (PendingChange pendingChange в pendingChanges) { сделай что-нибудь... }
Я подумал, что, установив рабочую область на workspace.GetLocalItemForServerItem (TFSProject), он даст мне ТОЛЬКО объекты для этой конкретной рабочей папки.
Есть ли способ заставить объект рабочей области иметь дело только с определенной рабочей папкой?
Это имело какой-то смысл? Заранее спасибо...
3 ответа
Итак, оказалось, что у меня поврежден кеш рабочего пространства TFS на моей машине. Вот решение (из командной строки):
SET AppDataTF =% USERPROFILE% \ Локальные настройки \ Данные приложения \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 ЕСЛИ СУЩЕСТВУЕТ "%AppDataVS%\8.0\Team Explorer" rd /s /q "%AppDataVS%\8.0\Team Explorer" > NUL ЕСЛИ СУЩЕСТВУЕТ "%AppDataVS%\9.0\Team Explorer" rd /s /q "%AppDataVS%\9.0\Team Explorer" > NUL
Другая часть проблемы заключается в том, что если папка проекта находится в той же рабочей области, она будет извлекать все ожидающие изменения из других проектов. Я создал вторичное рабочее пространство только с проектом SQLScripts и локальной папкой, и все работает как шарм.
Может быть, кто-то еще найдет это полезным...
Используя LINQ, вы можете получить ожидающие изменения определенной папки
PendingChange[] pendingChanges = workspace
.GetPendingChanges()
.Where(x => x.LocalOrServerFolder.Contains(argPath))
.ToArray();
Вот еще один способ обновить кеш рабочей области:
Рабочие пространства tf / s: http://sometfsserver:8080/
Кроме того, в Workspace есть метод UpdateWorkspaceInfoCache(..), который, кажется, делает то же самое. Я не проверял это, хотя.