如何在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,获取最后一次修改该文件的提交记录,从中提取修改时间。
具体实现步骤
- 获取目标文件列表:用你现有的Items API调用,可通过
path参数指定文件夹路径,过滤出需要查询的文件,避免遍历整个仓库。 - 遍历文件查询最后提交时间:对每个文件路径,调用Commits API,指定
itemPath参数过滤该文件的提交记录,取第一条最新记录中的时间字段。 - 输出结果到文件:将文件路径和对应时间整理后写入指定文件。
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
相关产品推荐
相关产品推荐

