Bitbucket Pipeline 试图获取与以下文件相比发生更改的文件列表

Bitbucket Pipeline trying to get list of files changed compared to

我有以下 bash 脚本用于在 bitbucket 管道中执行 linting 检查。

#!/bin/bash
set -e

git fetch origin master:refs/remotes/origin/master
FORK_POINT=$(git merge-base HEAD origin/master)
PY_FILES=$(git --no-pager diff --name-only HEAD $FORK_POINT | grep "\.py$")

if [ "$PY_FILES" ]; then
    flake8 $PY_FILES
else
    echo "No *.py files found"
    exit 0
 fi

在 UTC 时间 12 月 4 日下午 4 点左右之前,它一直运行良好。经过一些试验,我将问题缩小到这一行 PY_FILES=$(git --no-pager diff --name-only HEAD $FORK_POINT | grep "py$")。当我删除 grep 和 echo $PY_FILES 脚本成功完成但日志中没有显示任何内容。因此,当管道 运行 时 git --no-pager diff --name-only HEAD $FORK_POINT 似乎没有返回任何内容,我猜这会导致 grep 出错?当我在本地 运行 时一切正常,所以 git --no-pager diff --name-only HEAD $FORK_POINT 肯定会返回结果。

任何人都可以帮我找出这里出了什么问题,或者以另一种方式告诉我我可以获得 python 文件的列表,该文件在分支中更改为 运行 flake8 on?

看来您只需要调试您的管道;您的本地克隆与 bitbucket 管道使用的克隆之间的一个明显区别是您很可能不在处理同一个活动提交 (HEAD)。

让您的管道输出它正在处理的内容:

  • 它的主动提交:git rev-parse HEAD
  • 它的 origin/master 版本:git rev-parse origin/master
  • git merge-base 的结果:echo $FORK_POINT

根据您的评论:空的 FORK_POINT 可能表示管道是从与 origin/master 不再有共同祖先的提交中触发的。

检查远程的历史记录 HEAD :

git log --graph --oneline <sha from the pipeline>

例如,您可以将其与 origin/master 的历史进行比较:

git log --graph --oneline <sha> origin/master