使用TFS TF History来确定最新的变更集

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

首先,Team Build 已经有一个可以实现这个功能的特性了。你在使用其他什么吗?其次,任何对代码库的更改都足以触发构建吗?还是你需要查看某些特定目录中是否有更改? - Andrew
是的,我正在使用一个不同的系统,具体来说是BuildForge。我们使用TFS适配器进行CI构建,但我们只想在有更新时运行构建。由于构建是分支特定的,因此我只想知道该分支/文件夹中是否有更改。 - Joan Arc
Guanghui Qin的答案非常好,速度非常快,而且不需要工作空间。 - Yogurtu
6个回答

6

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

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

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

使用临时文件,但运行良好。


请注意,您无需中间文件,例如:tf vc info d:\w\code04\Server.sln | findstr /R "Last modified: [^\r\n]+r\n" - Dustin Oprea

2

正如安德鲁所提到的,TFS内置了持续集成功能。然而,是的,很容易查询自某个时间点或变更集以来的变更集。您需要查看该变更集和最新变更集之间的历史记录:

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

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


1
是的,这告诉我包括查询的那个变更集在内的所有变更集。我该如何从输出中仅解析数字?有没有使用批处理命令进行解析的方法? - Joan Arc

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环境变量包含了最新的变更集。

1

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

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

TFS适配器进一步在TFS源(更改集)和WorkItem级别实现了CI功能。开箱即用的报告提供了清晰的物料清单(BOM)报告,可交付给您构建的下游消费者。

最后,正如您所知,Build Forge的强大之处在于它能够将构建与部署(以及更多)联系起来。显然,有了这些持续集成能力,您就可以继续推进我相信您希望实现的持续交付能力。


1

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

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
您可以从此脚本中创建一个函数,并在构建脚本中调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接