我的存盤庫中有 2 個 Github Actions 作業流,其中一個步驟需要在 PR 中獲取所有已修改的檔案(洗掉的檔案除外)。我在第一個中使用它:
on:
pull_request:
branches: [ main ]
jobs:
get_files:
name: run_on_pr
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@master
with:
fetch-depth: 0
- name: Modified files
run: |
git fetch origin main:main
git diff --name-only --diff-filter=d main~ main
這個作業正常,我可以獲得所有已修改檔案的串列。但是,在合并 PR 時應該運行的第二個作業流程中,這不起作用。
on:
push:
branches: [ main ]
jobs:
get_files:
name: run_when_pr_is_merged
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@master
with:
fetch-depth: 0
- name: Modified files
run: |
git fetch origin main:main
git diff --name-only --diff-filter=d main~ main
我得到錯誤
fatal: refusing to fetch into branch 'refs/heads/main' checked out at '/home/runner/....'。我認為錯誤來自作業流,git fetch origin main:main因為作業流正在main分支上運行,我正在嘗試在那里進行提取。我已經洗掉了它,但仍然沒有得到我需要的串列。在兩個作業流程中獲取 PR 中修改檔案串列的任何幫助或更好的方法?
uj5u.com熱心網友回復:
它比這更復雜一些。
對于 PR 的 GitHub action/checkout,創建了一個分離的頭,它模擬 PR 到目標分支的合并。您可以在結帳操作本身的日志中看到它。你可以通過使用不同的 ref 來改變這種行為,但我不推薦它——它實際上讓事情變得更容易,尤其是對于分叉的 PR。
要獲取 PR 中已更改檔案的串列,您只需使用 fetch-depth: 2 簽出以獲取以前的提交,然后獲取通過合并修改的檔案:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Get changes
run: git diff --name-only -r HEAD^1 HEAD
對于push事件,它也有點復雜,因為您可以在單次推送中進行多次提交,所以在這里您必須 fetch-depth: 0 ,然后使用 GitHub 背景關系值來找出push:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Get changes
run: git diff --name-only ${{ github.event.before }} ${{ github.event.after }}
如果您想要一個作業流程來處理兩者,您可以執行以下操作:
- uses: actions/checkout@v3
with:
fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }}
- name: Get changed files
id: changed-files
run: |
if ${{ github.event_name == 'pull_request' }}; then
echo "changed_files=$(git diff --name-only -r HEAD^1 HEAD | xargs)" >> $GITHUB_OUTPUT
else
echo "changed_files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT
fi
- name: List changed files
run: |
for file in ${{ steps.changed-files.outputs.changed_files }}; do
echo "$file was changed"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/526287.html
上一篇:git無法合并不相關的歷史淺克隆
