我有一个被触发的 github 动作工作流程
on: pull_request
uses: tj-actions/changed-files@v35.
uses: actions/checkout@v3
它也会在每次推送到 PR 请求分支的提交时触发,这是可取的,但它会从 PR 开始时拾取该分支中所有更改的文件,而不仅仅是在最新提交中更改的文件。这导致我的操作逻辑出现问题。我怎样才能在我的操作中只获得最新的提交更改?
有人对可以提供此功能的已更改文件使用过其他操作吗?
您不需要任何特殊的 GitHub 操作工作流步骤来获取当前提交中所做的更改。您可以简单地使用
git diff
列出提交中更改的文件。请参阅How do I list all the files in a commit?.上的链接(评论中提到)
GITHUB_SHA
环境变量可用于获取拉取请求中的最新提交哈希。然后使用 git diff --name-only $GITHUB_SHA^
命令列出最新($GITHUB_SHA
)提交与其父(上一个)提交之间更改的文件。该命令使用 ^
符号来引用先前的提交。换句话说,它只会显示最新提交中所做的更改。
checkout
工作流步骤 仅获取最后一次提交,而没有其他提交的历史记录。
对于触发工作流的 ref/SHA,默认情况下仅获取单个提交。设置
以获取所有分支和标签的所有历史记录。fetch-depth: 0
这还不足以成功执行
git diff
命令。该操作需要至少两个提交在工作树中可用以执行彼此之间的比较。因此,为了能够进行 git diff
比较,您不仅需要最新的提交,而且之前的提交也必须包含在 checkout
步骤中才能成功执行命令。在你的情况下,设置 fetch-depth: 2
就足够了,因为只需要 2
提交(最新的和前一个)来制作 git diff
.
将以上所有要求放在一起:
steps:
- name: Checkout (fetch last two commits)
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Process files changed in the current commit
run: |
changedFiles=$(git diff --name-only $GITHUB_SHA)
for file in $changedFiles; do
echo "Processing file: $file"
done