git Azure DevOps Pipeline -仅获取修改或添加的文件

cbwuti44  于 2023-05-05  发布在  Git
关注(0)|答案(1)|浏览(167)

我有一个Azure DevOps管道,它执行一个Powershell任务,在提交拉取请求后为每个更改的文件创建工件。但是,我不能返回修改过的/新的文件来创建这些工件。当我在本地测试时,我可以很容易地获取修改后的文件名,但是在管道本身中,返回的结果是空白的:

$changes = git diff --name-only --relative --diff-filter=M origin/master --name-only -- .

完整.yml代码:

trigger:
- master

pool:
  vmImage: windows-latest

jobs:
- job: get_changed_files
  steps:  
   - task: PowerShell@2
     inputs:
       targetType: 'inline'
       script: |
         $targetfolder = "$(Build.StagingDirectory)" + "/"
         
         function CopyFiles{
             param( [string]$source )
         
             $target = $targetfolder + $source
         
             New-Item -Force $target
             copy-item $source $target -Force
         }
         $changes = git diff --name-only --relative --diff-filter=M origin/master --name-only -- .
         write-host "test"
         $changes
         if ($changes -is [string]){ CopyFiles $changes }
         else
         {
             if ($changes -is [array])
             {       
                 foreach ($change in $changes){ CopyFiles $change }
             }
         }
   - task: PublishBuildArtifacts@1
     inputs:
      pathToPublish: $(Build.StagingDirectory)
      artifactName: MyChangedFiles

更新:我将我的diff命令切换为以下命令:git diff --name-only --relative --diff-filter=AM HEAD^ HEAD并确认我的管道现在可以按预期工作。

inb24sb2

inb24sb21#

发生这种情况的原因是,在Pull Request完成后,您正在针对master运行管道。此时,管道正在比较masterorigin/master,它们总是相等的,所以diff不会找到任何东西。
另一种比较的方法是比较你的HEAD提交和它的第一个父提交,像这样:

git diff HEAD~1 HEAD
# or using @ syntax for HEAD
git diff @~1 @
# or using merge commit syntax
git diff @^ @

比较这两个提交只会在你的PR是使用Merge,Semi-Linear Merge,或Squash Merge完成的情况下起作用。
如果你使用一个rebase和快进PR完成策略,你不会从查看分支历史中知道有多少提交是“新的”,所以你需要存储你上次运行管道时的提交ID作为起点。

**旁注:**如果在管道运行之间可以完成多个PR,则可能会遗漏一些更改。克服这一点的一些方式是将流水线运行排队,使得每个运行针对特定提交发生并且没有完成的PR被跳过,或者保存流水线针对其运行的最后一个提交ID,如针对变基和快进完成策略所描述的。

相关问题