2014-02-28 55 views
0

是否有任何內置的方式來查找和刪除(tf destroy)很長一段時間內不活動(我的意思是沒有檢查操作)的TFS項目分支,比方說1個月。無論是tfs工具或可能會做到這一點的sql腳本都可以。找到並刪除不活動的tfs分支

+0

答案是肯定的,但它是一點努力建立一個工作示例。 –

+1

是的,您可以使用SSRS針對具有某些API的Warehouse數據庫執行此操作,但我們的BI開發人員對其進行了設置,因此我沒有除API查詢以外的其他詳細信息。不過,除非在合併到Main之前確實不關心變更的歷史,否則我會建議謹慎使用tf destroy。 – DaveShaw

回答

0

嗯,整個事情並不難,在這裏張貼的代碼,可以幫助別人:

private static string _tfLocation; //location of tf.exe 
private static string _tfProject; //our team project 

static void Main(string[] args) 
{ 
    _tfLocation = ConfigurationManager.AppSettings.Get("tfLocation"); 
    _tfProject = ConfigurationManager.AppSettings.Get("tfProject"); 
    var keepAliveBranches = ConfigurationManager.AppSettings.Get("keepAliveBranches").Split(',').ToList(); //branches that we keep anyway 
    var latestDate = DateTime.Now.AddMonths(-3); //we delete all branches that are older than 3 months 

    var folders = ExecuteCommand(string.Format("dir /folders \"{0}\"", _tfProject)); 
    var branches = folders.Split('\r', '\n').ToList(); 

    branches = branches.Where(b => !string.IsNullOrEmpty(b) && b.StartsWith("$")).Select(b => b.Remove(0, 1)).Skip(1).ToList(); 
    branches.ForEach(b => b = b.Remove(0, 1)); 

    foreach (var branch in branches) 
    { 
     if (keepAliveBranches.Contains(branch)) 
      continue; 

     //get latest changeset 
     var lastChangeset = ExecuteCommand(string.Format("history \"{0}/{1}\" /recursive /stopafter:1 /format:brief /sort:descending /noprompt", _tfProject, branch)); 
     var changesetDate = DateTime.Parse(Regex.Match(lastChangeset, @"\d{2}\.\d{2}\.\d{4}").Value); //get it's date 
     if (changesetDate < latestDate)       
      //destroy 
      ExecuteCommand(string.Format("destroy \"{0}/{1}\" /recursive /stopafter:1 /startcleanup /noprompt /silent", _tfProject, branch));    
    } 
} 

//execute console command and get results 
private static string ExecuteCommand(string command) 
{ 
    var process = new Process() 
    { 
     StartInfo = new ProcessStartInfo(_tfLocation) 
     { 
      UseShellExecute = false, 
      RedirectStandardOutput = true, 
      CreateNoWindow = true, 
      Arguments = command 
     }, 
    }; 
    process.Start(); 
    var result = process.StandardOutput.ReadToEnd(); 
    process.WaitForExit(); 

    return result; 
} 
2

你可以做到這一點,但你需要編寫一個小程序,使用TFS API檢查每個分支並刪除未使用的分支。

你可以使用一個簡單的C#控制檯應用程序,我可以從經驗告訴你,TFS公共API非常直觀且易於使用。你可以開始使用它here

Here的如何顯示所有分支。

1

未使用的分支包含元素修改歷史記錄,而不是刪除它們寫入分支並保留它。恢復的空間並不重要。