如何配置Azure DevOps Pipeline,仅复制静态网站最后提交的文件?
配置Azure DevOps Pipeline仅复制最后一次提交的文件
你当前使用文件本地修改时间筛选的方式不可靠——Azure DevOps构建代理拉取代码时,文件的LastWriteTime是拉取到本地的时间,而非仓库中的提交时间,所以会出现返回所有文件的问题。以下是两种可行的解决方案:
方案一:获取最后一次提交的变更文件(推荐)
通过Git命令直接提取最后一次提交中新增、修改的文件,再执行复制操作,替换原有PowerShell步骤:
trigger: - master pool: vmImage: windows-latest steps: - powershell: | # 获取最后一次提交的所有变更文件路径 $changedFiles = git diff --name-only HEAD~1 HEAD if ($changedFiles) { foreach ($file in $changedFiles) { $fullPath = Join-Path $(Build.Repository.LocalPath) $file # 仅处理存在的文件(排除已删除的文件) if (Test-Path $fullPath) { Write-Host "待复制文件: $fullPath" # 替换为你的目标路径,执行复制 # Copy-Item -Path $fullPath -Destination "$(Build.ArtifactStagingDirectory)/static-files" -Force } } } else { Write-Host "最后一次提交无变更文件" } displayName: '获取并复制最后一次提交的变更文件'
说明:
git diff --name-only HEAD~1 HEAD:列出上一次提交到当前提交之间的所有变更文件相对路径- 若为仓库首次提交(无
HEAD~1),可改为git diff --name-only HEAD来获取所有文件 - 代码中注释部分替换为你的实际复制目标路径即可
方案二:筛选最近5分钟内提交的变更文件
如果需要针对最近5分钟内的提交筛选文件,可使用Git的时间范围查询:
trigger: - master pool: vmImage: windows-latest steps: - powershell: | # 获取最近5分钟内提交的所有变更文件 $changedFiles = git log --since="5 minutes ago" --name-only --pretty=format:'' if ($changedFiles) { foreach ($file in $changedFiles | Select-Object -Unique) { # 去重重复文件 $fullPath = Join-Path $(Build.Repository.LocalPath) $file if (Test-Path $fullPath) { Write-Host "待复制文件: $fullPath" # Copy-Item -Path $fullPath -Destination "你的目标路径" -Force } } } else { Write-Host "最近5分钟内无变更文件" } displayName: '获取并复制最近5分钟提交的变更文件'
内容的提问来源于stack exchange,提问作者Vicente Lopez Garcia
相关产品推荐
相关产品推荐

