TFS UNDO others checkout - рекурсивно для всех пользователей

Как администратор TFS, мне снова и снова приходится архивировать / перемещать ветки в другие папки, чтобы убедиться, что наши папки TFS не загромождены старыми неиспользуемыми ветвями. Но когда я пытаюсь ПЕРЕМЕСТИТЬ ветки, если кто-либо из разработчиков извлек файл из этой ветки в своей рабочей области, тогда TFS не позволяет мне завершить операцию. Я должен отменить все эти проверки (для всех пользователей), прежде чем я смогу ПЕРЕМЕСТИТЬ ветку.

Инструменты TFS Power дают здесь некоторое облегчение. Это поможет вам отменить проверку других из Visual Studio (или из командной строки). Щелкните правой кнопкой мыши ветку -> Найти -> Найти по подстановочному знаку. Вы можете увидеть скриншоты ниже:

введите описание изображения здесь

введите описание изображения здесь

Но загвоздка в том, что он может выполнять операцию UNDO только для одного пользователя за раз. Таким образом, в большой организации, если у вас есть 100-200 разработчиков, работающих в ветке, это означает, что если каждый из 100 разработчиков извлекут по 1 файлу из ветки, то мне придется нажать кнопку UNDO 100 раз, чтобы сделать извлечение ветки бесплатным.

Я много искал и не нашел готового решения. Наконец, решение, которое я придумал для этого, - это создать сценарий PowerShell, который запрашивает TFS (для конкретной ветки), чтобы найти список файлов, выданных пользователям, затем он просматривает список пользователей и отменяет все проверенные файлы - этому пользователю в ветке.

Есть ли у кого-нибудь лучшее / более простое решение? Я буду ждать входных данных и, если не увижу особого ответа, я добавлю сценарий сюда, чтобы люди, находящиеся в аналогичной ситуации, могли им воспользоваться.


person Isaiah4110    schedule 06.03.2015    source источник


Ответы (2)


Вам следует использовать TFS Sidekicks. У них есть возможность легко обнаружить и отменить эти изменения.

http://www.attrice.info/cm/tfs/

Однако я бы поставил под сомнение жизнеспособность «перемещения» ветвей, поскольку TFS выполняет «ветвление + удаление» под прикрытием. Вам лучше удалить ветку и использовать переключатель «Показать удаленные элементы», чтобы просмотреть эти старые вещи ...

person MrHinsh - Martin Hinshelwood    schedule 06.03.2015
comment
Панель приложения Status Sidekick предоставляет следующие функции: Просмотр дерева ожидающих изменений, отфильтрованных по конкретному имени пользователя (пользователь может быть выбран из списка допустимых пользователей), имени проекта TFS и диапазона дат создания изменения. Как упоминалось выше, мы сможем получить ожидающие изменения только для одного пользователя, а не для всех пользователей сразу. - person Isaiah4110; 06.03.2015
comment
Если вы установите и используете его, вы обнаружите, что можете рекурсивно получать все ожидающие изменения, независимо от пользователя, для указанной папки. - person MrHinsh - Martin Hinshelwood; 06.03.2015

Как упоминал @MrHinsh, вы можете установить TFSSideKicks, чтобы решить проблему. Спасибо, мистер Хинш.

Если вы не хотите устанавливать дополнительные инструменты, вы можете добиться того же, используя следующий сценарий PowerShell. Обновите следующие параметры в скрипте и запустите его:

  1. Расположение TF
  2. Название отделения
  3. Имя коллекции TFS
  4. Расположение файла временного журнала

$tfLocation = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE" 
$tfsBranchName = “{enter your TFS branch/folder/file location}“ 
$tfsCollectionName = "http://tfsserver:8080/tfscollection” 
$logFile = “{log file location}“ 
Function GetUserFileList($tfsBranchName) 
{ 
	try{
        # Array to hold the object (user/file/workspace) objects 
        $arrayFileUserMapping = @(); 
        
        If (Test-Path $logFile) 
        { 
                Remove-Item $logFile; 
        } 
        
        Set-Location $tfLocation; 
        
        .\tf.exe status $tfsBranchName /collection:$tfsCollectionName /user:* /format:detailed /recursive >> $logFile; 
        
        Set-Location $PSScriptRoot; 
        
        foreach ($line in Get-Content $logFile) 
        {         
                If($line.StartsWith("$")) 
                { 
                        $objCurrFile = New-Object System.Object; 
                        $splitStringFile = $line -Split ";"; 
                        $objCurrFile | Add-Member -type NoteProperty -name FileName -value $splitStringFile[0];                         
                } 
                Else 
                { 
                        foreach ($singleLine in $line){ 
                                If($singleLine.StartsWith("  User")) 
                                { 
                                        $splitStringUser = $singleLine -Split ":"; 
                                        $objCurrFile | Add-Member -type NoteProperty -name User -value $splitStringUser[1];                                                                                 
                                } 
                                ElseIf($singleLine.StartsWith("  Workspace")) 
                                { 
                                        $splitStringWS = $singleLine -Split ":"; 
                                        $objCurrFile | Add-Member -type NoteProperty -name Workspace -value $splitStringWS[1];                                 
                                } 
                        } 
                } 
                
                $arrayFileUserMapping += $objCurrFile; 
        }         
                
        $uniqueWorkspaceArray = $arrayFileUserMapping | Group Workspace 
        $uniqueUserArray = $arrayFileUserMapping | Group User 
        
        for($i=0;$i -lt $uniqueUserArray.count; $i++) 
        { 
                $workspaceWOSpace = $uniqueWorkspaceArray[$i].Name.Trim() 
                $userWOSpace = $uniqueUserArray[$i].Name.Trim() 
                $workspace = $workspaceWOSpace + ";" + $userWOSpace; 
                
                Set-Location $tfLocation; 
                .\tf.exe undo $tfsBranchName /collection:$tfsCollectionName /workspace:""$workspace"" /recursive /noprompt;                 
                Set-Location $PSScriptRoot; 
        } 
	}
	Catch [system.exception]
 	{
  		"Oops, something's wrong!!!"
 	}
} 
GetUserFileList($tfsBranchName);

person Isaiah4110    schedule 23.03.2015