【问题标题】:Using TFS TF History to determine the latest changeset使用 TFS TF History 确定最新的变更集
【发布时间】:2012-05-07 11:09:28
【问题描述】:

我正在编写一个脚本,该脚本仅在源代码发生更改时才会运行构建。我需要知道自上次运行构建以来是否有变化。这曾经有效,因为文件夹不会被删除,因此很容易确定是否有更改,但现在每次运行构建时都会删除所有内容。我曾考虑使用 TFS TF 历史命令来查询最后一个变更集或最后两个变更集,但在仅解析输出中的变更集编号时遇到了问题。我也考虑过使用 changeset 命令。是否有任何命令行参数可用于回答问题,自日期或变更集编号以来是否发生了变化?

【问题讨论】:

  • 首先,Team Build 有一个功能可以做到这一点。你在用别的东西吗?其次,存储库中的任何更改是否足以触发构建,或者您是否需要查看某些特定目录或目录中是否有更改?
  • 是的,我使用的是不同的系统,特别是 buildforge。我们使用 TFS 适配器进行 CI 构建,但我们只想在有更新时运行构建。由于构建是特定于分支的,我只想知道该分支/文件夹是否有变化。
  • 秦广辉的回答,效果很好,速度很快,不需要工作空间。

标签: tfs tf-cli


【解决方案1】:

到没有本地工作空间的最新变更集编号,请使用此命令:

tf history /collection:"http://server:8080/tfs/Collection" "$/Project" /recursive /stopafter:1 /noprompt /login:domain\user,password

【讨论】:

    【解决方案2】:

    摘自我要构建的批处理文件。

    set _aPath="f:\TFS\a"
    set _TFPath="c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE"
    

    ...

    pushd %_aPath%
    %_TFPath%\TF.exe history . /r /noprompt /stopafter:1 /Version:W > temp
    FOR /f "tokens=1" %%a in ('findstr /R "^[0-9][0-9]*" temp') do set _BuildVersion=10.3.0.%%a
    del temp
    popd
    

    使用临时文件,但效果很好。

    【讨论】:

    • 注意不需要中间文件,例如:tf vc info d:\w\code04\Server.sln | findstr /R "Last modified: [^\r\n]+r\n"
    【解决方案3】:

    正如 Andrew 所提到的,TFS 具有内置的持续集成功能。但是,是的,从某个时间点开始查询变更集很容易,无论是日期还是变更集。您想查看该变更集与最新版本之间的历史记录:

    tf history <folder> /version:C<changeset>~T /noprompt /recursive
    

    如果唯一的行输出是您查询的变更集,那么显然自签入以来没有任何更改。否则,您将看到额外的变更集,每行一个。

    【讨论】:

    • 是的,这告诉我包括查询的变更集。我怎样才能从输出中单独解析数字?有没有办法使用批处理命令进行解析?
    【解决方案4】:

    有一个适配器可以集成 BuildForge 和 Microsoft Team Foundation Server。如果您有兴趣,这里是网址...http://www-304.ibm.com/partnerworld/gsd/solutiondetails.do?&solution=46360&lc=en

    用于 Rational Build Forge 的 Automatra TFS 适配器提供持续集成 (CI) 和报告功能。

    TFS 适配器进一步在 TFS 源(变更集)和工作项级别启用 CI 功能。开箱即用的报告可提供清晰的物料清单 (BOM) 报告,这些报告可以交付给构建的下游消费者。

    最后,您必须知道,Build Forge 的优势在于它能够将构建与部署(及其他)联系起来。显然,有了这些持续集成功能,您就可以继续使用我相信您希望实现的持续交付功能。

    【讨论】:

      【解决方案5】:

      我的 PowerShell 脚本名为 GetVcsRevision.ps1,位于 VCS Root 的子文件夹中:

      param (
          [string]$PathToTF='C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe'
          ,[Parameter(Mandatory=$true)][string]$Login
          ,[Parameter(Mandatory=$true)][string]$Password
      )
      $result = &$PathToTF @("history","/stopafter:1","/recursive","..\*","/login:""$Login"",""$Password""") 2>&1 3>&1
      
      if ($result.GetType().Name -eq "Object[]")
      {
          <# $result format is:
              Changeset User              Date       Comment
              --------- ----------------- ---------- ----------------------------------------
              26038     user              24.06.2014 Sample commit comment
      
              $result[2] is:
              26038     user              24.06.2014 Sample commit comment
      
              $result[2].Split(" ")[0] is:
              26038
          #>
      
          $result[2].Split(" ")[0]
      }
      else
      {
          "0"
      }
      

      它正在将最后一个变更集编号发送到输出管道。如果出现问题,则此号码为0

      您可以从此脚本创建一个函数并在构建脚本中调用它。

      【讨论】:

        【解决方案6】:

        我的单行命令:

        for /f "usebackq tokens=*" %%a in (`tf history . /recursive /noprompt /stopafter:1 /version:T ^| powershell -Command "$input | ? { $_ -imatch '^(\d+)\s+' } | %% { $matches[0].Trim() } | Select-Object -First 1"`) do set TIP_CHANGESET=%%a
        

        执行 TIP_CHANGESET 环境后。变量包含提示变更集

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-25
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          • 2015-12-21
          • 2011-03-21
          • 1970-01-01
          • 2012-05-02
          相关资源
          最近更新 更多