You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure DevOps流水线中获取仓库多文件夹文件最后写入时间?

Azure DevOps仓库文件最后写入时间查询方案

问题场景

需要在Azure DevOps流水线中查询仓库内多个文件夹下文件的最后写入时间,并将文件路径与对应时间写入文件。尝试用PowerShell任务实现时,发现代理检出仓库后,文件的最后写入时间会被覆盖为流水线的最后提交时间,无法获取真实的文件修改时间,因此希望通过ADO API实现需求。

已尝试方案

  • PowerShell脚本直接读取本地文件时间:因代理检出机制导致时间被覆盖,无效
  • ADO Items API调用:仅能获取文件路径列表,无法拿到最后修改时间

当前使用的Items API格式:

$repoUrl = [string]::Format("https://dev.azure.com/{0}/{1}/_apis/git/repositories/{2}/items?recursionLevel=Full&api-version=7.0", $orgName, $projectId, $repoId)

可行解决方案:结合Items API与Commits API

要获取文件的最后修改时间,需要先通过Items API拿到目标文件列表,再对每个文件调用Git Commits API,获取最后一次修改该文件的提交记录,从中提取修改时间。

具体实现步骤

  1. 获取目标文件列表:用你现有的Items API调用,可通过path参数指定文件夹路径,过滤出需要查询的文件,避免遍历整个仓库。
  2. 遍历文件查询最后提交时间:对每个文件路径,调用Commits API,指定itemPath参数过滤该文件的提交记录,取第一条最新记录中的时间字段。
  3. 输出结果到文件:将文件路径和对应时间整理后写入指定文件。

PowerShell脚本示例(可直接用于ADO流水线任务)

# 配置参数
$orgName = "你的组织名"
$projectId = "你的项目ID"
$repoId = "你的仓库ID"
$targetFolder = "/目标文件夹路径" # 示例:"/src/app"
$outputFile = "file_last_modified_times.txt"
$apiVersion = "7.0"

# 获取目标文件夹下的文件列表
$itemsUrl = "https://dev.azure.com/$orgName/$projectId/_apis/git/repositories/$repoId/items?path=$targetFolder&recursionLevel=Full&api-version=$apiVersion"
$files = Invoke-RestMethod -Uri $itemsUrl -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method Get

# 初始化输出文件
Set-Content -Path $outputFile -Value "文件路径|最后修改时间`n"

# 遍历每个文件查询最后修改时间
foreach ($item in $files.value) {
    # 跳过文件夹,只处理文件
    if ($item.isFolder -eq $false) {
        # 构造Commits API请求地址
        $commitsUrl = "https://dev.azure.com/$orgName/$projectId/_apis/git/repositories/$repoId/commits?itemPath=$($item.path)&top=1&api-version=$apiVersion"
        $commit = Invoke-RestMethod -Uri $commitsUrl -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method Get
        
        if ($commit.value.Count -gt 0) {
            # 提取最后修改时间(可根据需求选择author.date或committer.date)
            $lastModifiedTime = $commit.value[0].author.date
            # 写入结果到文件
            Add-Content -Path $outputFile -Value "$($item.path)|$lastModifiedTime"
        }
    }
}

Write-Host "文件最后修改时间已写入 $outputFile"

流水线配置注意事项

  • 在PowerShell任务的"附加选项"中,勾选允许脚本访问OAuth令牌,这样才能通过$env:SYSTEM_ACCESSTOKEN获取流水线的系统令牌,用于API授权。
  • 确保流水线的服务账号或系统托管身份对目标仓库有读取权限。

内容的提问来源于stack exchange,提问作者NK94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:37:20