如何在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."
还有几个疑问:
- 如何下载从特定提交到最新版本的所有新增文件?
- Azure DevOps是否有现成的可用扩展?
- 如何将这些文件作为数据库构建输出的工件?
更新:我尝试了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
相关产品推荐
相关产品推荐

