【问题标题】:How to get latest version of specific project in TFS using Powershell.如何使用 Powershell 在 TFS 中获取特定项目的最新版本。
【发布时间】:2016-01-28 23:50:27
【问题描述】:

我浏览了很多帖子,但仍然不明白。我需要一个 powershell 脚本来下载特定项目的最新版本。

假设我只想从 ProjectA 分支 dfe 下载文件的最新副本。我看到一些 PS 脚本删除旧文件并再次下载所有文件,但这需要太长时间。覆盖现有文件的脚本会好得多。我尝试了 update-tfsworkspace,它会下载所有内容,但我不想下载所有内容。 服务器:http://servername:8080/tfs/DefaultCollection

默认集合 项目A -文件夹 1 - 分支 dfe -文件夹2 - 分支 abc

项目B -文件夹 1 - 分支 - 分支

【问题讨论】:

    标签: powershell tfs


    【解决方案1】:

    首先,您需要一个良好的工作区映射。您可以手动创建一个,也可以从下面的 xml 文件创建一个。此外,您要覆盖的功能是 [Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::Overwrite

    function Get-ProjectXml {
    [CmdletBinding()]
    Param(
        [string] $tfs13Url,
        [string] $workspaceName ,
        [string] $workspaceDescription,
        [string] $fileName,
        [bool] $autoDeleteCreate)
    
        try
        { 
            #Connect to TFS:
            $tfs13 = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfs13url)
            $vcs13 = $tfs13.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
    
            $workspaces=$vcs13.QueryWorkspaces($workspaceName, $vcs13.AuthenticatedUser, [Environment]::MachineName);
            if($autoDeleteCreate ){
                #Delete if Workspace exists, as this is an automated process...
                if ($workspaces.count -gt 0)
                {
                    $vcs13.DeleteWorkspace($workspaceName, $vcs13.AuthenticatedUser);
                }
                $workspace = $tfs10.VCS.CreateWorkspace($workspaceName, $vcs13.AuthenticatedUser, $workspaceDescription);
            }
            else
            {
                $workspace=$workspaces[0]
            }
            #Get XML File
            [xml]$xmlMappings= New-Object System.Xml.XmlDocument
            $xmlMappings.Load($fileName)
            $rootLocalItem=$xmlMappings.Root.LocalItem
    
            #Iterate through each collection
            foreach($collection in $xmlMappings.Collection){
                write-host "Mapping project $($collection.Name)"
    
                #Iterate through each project
                foreach($project in $collection.Project){
                write-host "Mapping project $($project.Name)"
                foreach($mapping in $project.Mapping){
                    $workspace.Map($mapping.ServerItem, $mapping.LocalItem);
                   }
                }
            }            
            $resultTime= Measure-Command {
                $result=$workspace.Get([Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest,[Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::Overwrite)
            }
            $resultAlerts=$result.NumConflicts+ $result.NumFailures+ $result.NumWarnings
            if ($resultAlerts -eq 0) {
                Write-host "Get Operation completed without any errors. $($result.NumUpdated) files are updated on workspace: $($workspace.name)" }
            else {
                Write-Host "Get Operation completed with errors. Please check errors: $($result.GetFailures)"}
                $resultTime.ToString()
        }
        catch
        {
            return $_.exception
        }
    }
    [string] $tfs13Url="http://tfs:8080/tfs/defaultcollection",
    [string] $workspaceName = "AutomatedWorkspace",
    [string] $workspaceDescription = "AutomatedWorkspace",
    [string] $fileName="D:\projects\ProjectMapping.xml",
    [bool] $autoDeleteCreate =$true 
    
    Get-ProjectXml $tfs13Url $workspaceName $workspaceDescription $fileName $autoDeleteCreate
    

    假设你的 xml 是这样的:

       <?xml version="1.0"?>
        <Collection Name="DefaultCollection">
          <Root>
            <ServerItem>$/</ServerItem>
            <LocalItem>d:\Src</LocalItem>
          </Root>
          <Project name="ProjectA">
            <Mapping>
              <ServerItem>$/ProjectA/Folder1/BranchDEF</ServerItem>
              <LocalItem>d:\Src\ProjectA\Folder1\BranchDEF\</LocalItem>
            </Mapping>
            <Mapping>
              <ServerItem>$/ProjectA/Folder2\BranchABC</ServerItem>
              <LocalItem>d:\Src\ProjectA\Folder2\BranchABC</LocalItem>
            </Mapping>
         </Project>
         <Project Name="ProjectB">
            <Mapping>
              <ServerItem>$/ProjectB/Folder5\BranchXYZ</ServerItem>
              <LocalItem>d:\Src\ProjectB\Folder5\BranchXYZ</LocalItem>
            </Mapping>
         </Project>
        </Collection> 
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 2014-02-13
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多