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

如何在Azure DevOps中获取两次提交间的文件及相关问题

问题描述

我想获取两次Git提交之间的指定SQL文件,尝试用这个命令:

git diff <commitFrom>  <commitTo> Scripts/**/*.sql

接着想基于这个结果生成归档文件,用了下面的命令,但生成的artifact.zip是空的:

git archive --output=artifact.zip HEAD (git diff <commitFrom>  <commitTo> UpdateScripts/**/*.sql)

另外,我试了Git Exec New SQL Files扩展,出现错误:

Exception calling "DownloadString" with "1" argument(s): "Illegal characters in path."

还有几个疑问:

  1. 如何下载从特定提交到最新版本的所有新增文件?
  2. Azure DevOps是否有现成的可用扩展?
  3. 如何将这些文件作为数据库构建输出的工件?

更新:我尝试了PowerShell任务,但没法过滤指定文件夹的内容:

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
    # Write your PowerShell commands here.

    git archive --output=file.zip HEAD $(git diff --diff-filter=ACMRT --name-only ${{parameters.firstChangeset}}..${{parameters.secondChangeset}}  "Scripts/*.sql")

解决方案

1. 修复Git归档命令,正确生成指定文件压缩包

你之前的git archive命令在PowerShell里语法有误,直接用$(...)会导致解析问题,改成用PowerShell变量处理文件列表即可:

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      # 获取两次提交之间Scripts文件夹下的SQL文件列表(递归匹配子目录)
      $files = git diff --diff-filter=ACMRT --name-only "${{parameters.firstChangeset}}..${{parameters.secondChangeset}}" "Scripts/**/*.sql"
      # 有符合条件的文件才生成归档包
      if ($files) {
        git archive --output=file.zip HEAD $files
      } else {
        Write-Host "没有找到符合条件的SQL文件"
      }
  • 若只需新增文件,把--diff-filter=ACMRT改成--diff-filter=A
  • 用Scripts/**/*.sql确保递归匹配Scripts下所有子目录的SQL文件,解决你之前无法过滤指定文件夹的问题

2. 下载特定提交到最新版本的新增文件

用以下命令获取从<commitFrom>到最新版本(HEAD)的新增SQL文件并归档:

# 获取新增文件列表
$files = git diff --diff-filter=A --name-only "<commitFrom>..HEAD" "Scripts/**/*.sql"
# 生成归档包
if ($files) {
  git archive --output=new_sql_files.zip HEAD $files
}

3. Azure DevOps可用扩展建议

官方没有专门推荐的"Git Exec New SQL Files"类扩展,你遇到的扩展错误大概率是路径含特殊字符导致的。优先用原生Git命令+PowerShell任务替代,稳定性更高。如果需要可视化查看差异,可以试试Git Diff Viewer扩展,但归档操作还是脚本更可靠。

4. 将文件发布为构建工件

在Azure DevOps中,归档完成后添加Publish Build Artifacts任务,把生成的文件/压缩包发布为工件:

发布压缩包

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)/file.zip'
    ArtifactName: 'SQLScripts'
    publishLocation: 'Container'

直接发布SQL文件

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: 'Scripts/'
    ArtifactName: 'SQLScripts'
    publishLocation: 'Container'
    Contents: '**/*.sql'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:35:24