使用TFS TF历史记录确定最新的变更集

时间:2012-04-26 17:10:32

标签: tfs tf-cli

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

6 个答案:

答案 0 :(得分:4)

要使用没有本地工作区的最新变更集编号,请使用以下命令:

Traceback (most recent call last):
  File ".../new_main.py", line 61, in <module>
    if __name__ == "__main__": main()
  File ".../new_main.py", line 39, in main
    mp = build()
  File ".../common.py", line 54, in build
    m = r.build_from_config(map_config, character_config)
  File ".../config_reader.py", line 148, in build_from_config
    item["squares"]
  File ".../new_map.py", line 49, in build_map
    self.view = MapView(self)
  File ".../new_map.py", line 135, in __init__
    self.screen = reset_screen()
NameError: name 'reset_screen' is not defined

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

正如安德鲁所说,TFS内置了持续集成功能。但是,是的,从某个点开始查询变更集很容易,无论是日期还是变更集。您想查看该变更集与最新变更集之间的历史记录:

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

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

答案 3 :(得分:1)

有一个适配器可以集成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源(变更集)和WorkItem级别启用CI功能。开箱即用的报告提供了清晰的物料清单(BOM)报告,可以提供给您构建的下游消费者。

     

最后,正如您必须意识到的那样,Build Forge的优势在于它能够将构建与部署(以及更高版本)联系起来。显然,通过这些持续集成功能,您可以继续使用我相信您希望实现的持续交付功能。

答案 4 :(得分:1)

我的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

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

答案 5 :(得分:1)

我的一行命令:

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后。变量包含提示变更集