You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GitHub Action更新README文件失败问题求助

解决GitHub Action更新README未生效的问题

问题场景

想要通过GitHub Action更新仓库README中被<!-- start-quote --><!-- end-quote -->标记的段落,编写了如下Workflow:

name: readme-quote

on:
  push:
  schedule:
    - cron: '0 */12 * * *'

jobs:
  add_quote:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    - name: Get an inspirational quote
      run: |
        QUOTE="This quote is fetched from a remote api using CURL"
        echo "$QUOTE"

    - name: Update quote in readme
      run: |-
        # Set a default quote if the 
        echo "${QUOTE:=>Silence is Golden}"
        # Disable interpreting exclamation mark! as a command
        histchars=
        # Set delimiters to variables
        start_delimiter="<!-- start-quote -->"
        end_delimiter="<!-- end-quote -->"
        # Remove previous quote with its delimter
        sed -i "/$start_delimiter/,/$end_delimiter/d" README.md
        # Add the new quote to the README file
        printf "$start_delimiter\n$QUOTE\n$end_delimiter\n" >> README.md

    - name: Commit and push changes if README changed
      run: |-
        git diff
        git config --local user.email "github-actions@example.com"
        git config --local user.name "GitHub Actions"
        git add README.md
        git diff --quiet || (git add README.md && git commit -m "Added new quote to README")
        git push origin main

该Workflow本地运行正常,GitHub Actions显示执行成功,但README并未更新。日志显示文件已被修改,但最后输出Everything up-to-date:

Run git diff
  git diff
  git config --local user.email "github-actions@example.com"
  git config --local user.name "GitHub Actions"
  git add README.md
  git diff --quiet || (git add README.md && git commit -m "Added new quote to README")
  git push origin main
  shell: /usr/bin/bash -e {0}
diff --git a/README.md b/README.md
index 94b5482..ce225aa 100644
--- a/README.md
+++ b/README.md
@@ -27,4 +27,5 @@

 <!-- start-quote -->
-<!-- end-quote -->
\ No newline at end of file
+> Silence is Golden
+<!-- end-quote -->
Everything up-to-date

问题原因

  1. 环境变量跨Step不共享:在Get an inspirational quote步骤中定义的QUOTE变量仅在当前Step的Shell中有效,后续Update quote in readme步骤无法访问该变量,导致只能使用默认值。
  2. Commit逻辑错误:提前执行了git add README.md,之后用git diff --quiet检查工作区与暂存区的差异,此时两者已无差异,因此不会触发commit操作,最终push时没有可提交的内容。

修复方案

1. 修正环境变量传递

在获取quote的步骤中,将变量写入GITHUB_ENV,让后续步骤能读取到:

- name: Get an inspirational quote
  run: |
    QUOTE="This quote is fetched from a remote api using CURL"
    echo "QUOTE=$QUOTE" >> $GITHUB_ENV

2. 修复Commit逻辑

移除提前执行的git add README.md,改为在检测到文件与仓库HEAD有差异时,再执行add和commit:

- name: Commit and push changes if README changed
  run: |-
    git config --local user.email "github-actions@example.com"
    git config --local user.name "GitHub Actions"
    # 检查README与HEAD版本是否有差异
    if ! git diff --quiet HEAD -- README.md; then
      git add README.md
      git commit -m "Added new quote to README"
      git push origin main
    fi

3. 完善默认值赋值

在Update quote in readme步骤中,要将默认值实际赋值给QUOTE变量,而不是仅打印:

- name: Update quote in readme
  run: |-
    # 设置默认quote
    QUOTE="${QUOTE:=>Silence is Golden}"
    # 禁用感叹号的命令解析
    histchars=
    # 定义分隔符变量
    start_delimiter="<!-- start-quote -->"
    end_delimiter="<!-- end-quote -->"
    # 删除之前的quote及分隔符
    sed -i "/$start_delimiter/,/$end_delimiter/d" README.md
    # 将新quote添加到README
    printf "$start_delimiter\n$QUOTE\n$end_delimiter\n" >> README.md

完整修复后的Workflow

name: readme-quote

on:
  push:
  schedule:
    - cron: '0 */12 * * *'

jobs:
  add_quote:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    - name: Get an inspirational quote
      run: |
        QUOTE="This quote is fetched from a remote api using CURL"
        echo "QUOTE=$QUOTE" >> $GITHUB_ENV

    - name: Update quote in readme
      run: |-
        # 设置默认quote
        QUOTE="${QUOTE:=>Silence is Golden}"
        # 禁用感叹号的命令解析
        histchars=
        # 定义分隔符变量
        start_delimiter="<!-- start-quote -->"
        end_delimiter="<!-- end-quote -->"
        # 删除之前的quote及分隔符
        sed -i "/$start_delimiter/,/$end_delimiter/d" README.md
        # 将新quote添加到README
        printf "$start_delimiter\n$QUOTE\n$end_delimiter\n" >> README.md

    - name: Commit and push changes if README changed
      run: |-
        git config --local user.email "github-actions@example.com"
        git config --local user.name "GitHub Actions"
        # 检查README是否有修改
        if ! git diff --quiet HEAD -- README.md; then
          git add README.md
          git commit -m "Added new quote to README"
          git push origin main
        fi

内容的提问来源于stack exchange,提问作者Drk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:50:42