Недавно мы обновились с TFS 2010 до TFS 2015. Все кажется прекрасным после обновления, но мы получаем ошибку «Элемент заблокирован в рабочей области (ноль ноль)." в некоторых файлах управления версиями. Похоже, у нас есть некоторые осиротевших замки, которые должны быть найдены и очищены, но таблица базы данных tbl_lock не в базе данных, поэтому следующий запрос на выборку не будет работать:TFS 2015 Элемент заблокирован в рабочей области (null); (null)
select * FROM tbl_Lock l
LEFT JOIN tbl_PendingChange pc
ON l.PendingChangeId = pc.PendingChangeId
WHERE pc.PendingChangeId IS NULL
Кто-нибудь знает, как обнаружить и удалить эти блокировки в TFS 2015?
Я также установил электроинструменты TFS, и ни Visual Studio 2015, ни электрические инструменты не собирают блокировки.
Обновлено:
Кстати, когда я запускаю запрос SELECT, чтобы узнать, где PendingChangeId является NULL, я получаю обратно никаких строк. Я думаю, что трюк - ЛЕВЫЙ ПРИСОЕДИНЕНИЕ. PendingChangeId будет NULL, если tbl_Lock также не имеет записи для PendingChangeId на tbl_PendingChange (и, таким образом, блокировка была потеряна). Поэтому мне все равно нужно знать, где, как правило, PendingChangeId должен быть подключен к TFS 2015, чтобы определить, какие файлы имеют плохой замок. (Или там, где рабочее пространство больше не существует, что может быть другим возможным источником для выпуска.)
И еще мне нужно знать, как очистить эти плохие замки. Я бы предпочел сделать это с помощью инструментов, либо с помощью графического интерфейса, либо с помощью командной строки, но также мог бы сделать это программно либо с использованием файлов API-интерфейсов API, либо с помощью файлов объектной модели TFS для TFS 2015.
Я действительно хотел бы только коснуться база данных непосредственно в качестве последнего канава. И я также предпочел бы использовать tf vc destroy в качестве последнего курортного курорта, так как это уничтожит всю историю файлов.
Update 2
Aha! Я думаю, что нашел способ идентифицировать файлы, и похоже, что мое мышление о том, что произошло, может быть правильным. К сожалению, мне пришлось исследовать базу данных, используя запрос READ UNCOMMITTED, чтобы найти информацию. Я не мог получить эту информацию программно или с помощью инструментов. (Все они показали, или действовали как файл не проверил.) Запрос, который я использовал на TFS 2015 был:
select pc.* from tbl_PendingChange pc
left join tbl_Workspace ws on pc.WorkspaceId = ws.WorkspaceId
where ws.WorkspaceId is null
Возвращаемых три файла, которые имеют (NULL), (NULL) блокировку на нашем потому что WorkspaceId, указанный в tbl_PendingChange, больше не существует в tbl_Workspace.
Как это произошло? Наш сервер CI использует временные рабочие пространства TFS. Я думаю, что после обновления произошло то, что наш сервер CI отправился проверить файл и применить к нему обновление. (Например, чтобы увеличить номера версий как часть процесса сборки.) Он проверил файл, но не смог применить обновление. (Наши инструменты, как работа с рабочими областями сервера, но, возможно, закончились локальной рабочей областью, и, таким образом, файл по-прежнему был отмечен в Local, но выведен на сервер. Таким образом, изменение файла не может быть применено.) код, который мы используем, выполняет рабочую область. Удалите операцию, когда процесс завершен, поэтому рабочее пространство было удалено - даже несмотря на то, что в рабочей области все еще был извлечен файл! Таким образом, это создало сиротскую запись на tbl_PendingChange, которая не связана с какой-либо рабочей областью, и, следовательно, файл по-прежнему заблокирован с ожидающими изменениями. Но графический интерфейс и инструменты не видят его как такового, потому что они не понимают, что рабочее пространство ожидающих изменений отсутствует.
Итак, это возвращает меня к тому, как я исправить это? Если кто-то знает, как добраться до этих сиротских ожидающих изменений, я был бы признателен. Я пробовал использовать:
TfsTeamProjectCollection tfsTeamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(szProjectUri));
VersionControlServer versionControlServer = tfsTeamProjectCollection.GetService<VersionControlServer>();
string[] items = new[] { ... server item path ... };
PendingSet[] queryPendingSets = versionControlServer.QueryPendingSets(items, RecursionType.None, null, null);
PendingSet[] getPendingSets = versionControlServer.GetPendingSets(items, RecursionType.None);
но они не находят сирот.
Update 3
Я, наконец, установлен Team Foundation Sidekicks 2015 и дал ему попробовать - инструмент статуса специально, но затем другие инструменты. Это поиск ожидающих изменений, но не осиротевших.
Но как я могу представить рабочее пространство (null); (null)? Я также не вижу его в качестве удаленной рабочей области, даже если я зарегистрирован как администратор коллекции проектов. – Jeff
Я также попытался положить (нуль) и * и ничего в графический интерфейс, и он говорит мне, что идентификатор не найден или мне нужен владелец. – Jeff
Я тоже попробовал; и (null); (null) и *; * в командах, и ни один из них не работает либо для tf vc undo. Когда я перечисляю рабочие пространства с рабочими пространствами tf, я также не вижу (null), (нулевое) рабочее пространство. – Jeff