Использование TFS TF History для определения последнего набора изменений

Я пишу скрипт, который будет запускать сборку только в случае изменения исходного кода. Мне нужно знать, есть ли изменения с момента последнего запуска сборки. Раньше это работало, потому что папка не удалялась, поэтому было легко определить, были ли изменения, но теперь все удаляется при каждом запуске сборки. Я думал об использовании команды истории TFS TF для запроса последнего набора изменений или последних двух наборов изменений, но у меня возникли проблемы с анализом только номера набора изменений из выходных данных. Я также рассматривал возможность использования команды changeset. Есть ли какой-либо параметр командной строки, который я могу использовать для ответа на вопрос, были ли изменения с даты или номера набора изменений?


person Joan Arc    schedule 26.04.2012    source источник
comment
Во-первых, в Team Build уже есть функция, которая это делает. Вы используете что-то другое? Во-вторых, достаточно ли любого изменения в репозитории, чтобы инициировать сборку, или вам нужно увидеть, есть ли изменения в каком-то конкретном каталоге или каталогах?   -  person Andrew    schedule 26.04.2012
comment
Да, я использую другую систему, в частности buildforge. Мы используем адаптер TFS для сборок CI, но хотим запускать сборку только при наличии обновления. Поскольку сборка зависит от ветки, я хочу знать только, есть ли изменения в этой ветке/папке.   -  person Joan Arc    schedule 27.04.2012
comment
Ответ от Guanghui Qin работает очень хорошо, очень быстро, и вам не нужно для этого рабочее пространство.   -  person Yogurtu    schedule 10.03.2016


Ответы (6)


Чтобы получить последний номер набора изменений без локальной рабочей области, используйте эту команду:

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

выдержка из моего пакетного файла для сборки.

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

использует временный файл, но работает хорошо.

person Nathan    schedule 04.02.2013
comment
Обратите внимание, что вам не требуется промежуточный файл, например: tf vc info d:\w\code04\Server.sln | findstr /R "Last modified: [^\r\n]+r\n" - person Dustin Oprea; 28.09.2016

Как упомянул Эндрю, TFS имеет встроенную функцию непрерывной интеграции. Однако да, запросить наборы изменений с определенной точки, будь то дата или набор изменений, легко. Вы хотите просмотреть историю между этим набором изменений и последним:

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

Если единственным выводом строки является запрошенный вами набор изменений, то, очевидно, с момента регистрации изменений не было. В противном случае вы увидите дополнительные наборы изменений, по одному на строку.

person Edward Thomson    schedule 26.04.2012
comment
Да, это говорит мне о наборах изменений, включая запрошенный. Как я могу разобрать только число из вывода? Есть ли способ разобрать с помощью пакетных команд? - person Joan Arc; 27.04.2012

Существует адаптер, который может интегрировать BuildForge и Microsoft Team Foundation Server. Вот URL, если вам интересно...http://www-304.ibm.com/partnerworld/gsd/solutiondetails.do?&solution=46360&lc=en

Адаптер Automatra TFS для Rational Build Forge обеспечивает непрерывную интеграцию (CI) и возможности создания отчетов.

Адаптер TFS также обеспечивает возможности непрерывной интеграции как на уровне источника TFS (набор изменений), так и на уровне рабочего элемента. Готовые отчеты предоставляют четкие отчеты о спецификациях (BOM), которые могут быть доставлены последующим потребителям ваших сборок.

Наконец, как вы должны знать, сила Build Forge заключается в его способности связывать сборку с развертыванием (и далее). Очевидно, что с помощью этих возможностей непрерывной интеграции вы сможете двигаться вперед с возможностями непрерывной доставки, которых, как я полагаю, вы хотите достичь.

person Ka Ho    schedule 05.12.2012

Мой скрипт 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.

Вы можете сделать функцию из этого скрипта и вызвать ее в своем скрипте сборки.

person v.karbovnichy    schedule 24.06.2014

Моя однострочная команда:

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 env. переменная содержит набор изменений подсказки

person Sergey Azarkevich    schedule 16.06.2015