|
| 1 | +name: Make commit on patch |
| 2 | + |
| 3 | +on: |
| 4 | + workflow_dispatch: |
| 5 | + inputs: |
| 6 | + repo_url: |
| 7 | + description: 'Git 仓库 URL' |
| 8 | + required: true |
| 9 | + start_commit: |
| 10 | + description: '起始提交' |
| 11 | + required: true |
| 12 | + end_commit: |
| 13 | + description: '结束提交' |
| 14 | + required: true |
| 15 | + patch_type: |
| 16 | + description: '补丁文件类型' |
| 17 | + required: true |
| 18 | + default: '多个' |
| 19 | + type: choice |
| 20 | + options: |
| 21 | + - '单个' |
| 22 | + - '多个' |
| 23 | + |
| 24 | +jobs: |
| 25 | + Make: |
| 26 | + runs-on: ubuntu-latest |
| 27 | + steps: |
| 28 | + - name: 检出当前仓库 |
| 29 | + uses: actions/checkout@v4 |
| 30 | + |
| 31 | + - name: 生成补丁文件 |
| 32 | + id: generate |
| 33 | + run: | |
| 34 | + #!/bin/bash |
| 35 | + set -euo pipefail |
| 36 | +
|
| 37 | + # 修正输入参数访问方式 |
| 38 | + REPO_URL="${{ github.event.inputs.repo_url }}" |
| 39 | + START_COMMIT="${{ github.event.inputs.start_commit }}" |
| 40 | + END_COMMIT="${{ github.event.inputs.end_commit }}" |
| 41 | + PATCH_TYPE="${{ github.event.inputs.patch_type }}" |
| 42 | + OUTPUT_DIR="./patches" |
| 43 | +
|
| 44 | + # 创建临时目录 |
| 45 | + TEMP_DIR=$(mktemp -d) |
| 46 | + echo "临时工作目录: $TEMP_DIR" |
| 47 | +
|
| 48 | + # 克隆仓库(单分支完整历史) |
| 49 | + echo "正在克隆仓库(单分支完整历史)..." |
| 50 | + git clone --single-branch "$REPO_URL" "$TEMP_DIR" |
| 51 | + cd "$TEMP_DIR" |
| 52 | +
|
| 53 | + # 获取实际提交哈希 |
| 54 | + echo "正在解析提交哈希..." |
| 55 | + START_HASH=$(git rev-parse "$START_COMMIT") |
| 56 | + END_HASH=$(git rev-parse "$END_COMMIT") |
| 57 | +
|
| 58 | + # 验证提交是否存在 |
| 59 | + if ! git rev-parse --verify "$START_HASH" >/dev/null 2>&1; then |
| 60 | + echo "::error::起始提交 '$START_COMMIT' 不存在" |
| 61 | + exit 1 |
| 62 | + fi |
| 63 | +
|
| 64 | + if ! git rev-parse --verify "$END_HASH" >/dev/null 2>&1; then |
| 65 | + echo "::error::结束提交 '$END_COMMIT' 不存在" |
| 66 | + exit 1 |
| 67 | + fi |
| 68 | +
|
| 69 | + # 创建输出目录 |
| 70 | + mkdir -p "$OUTPUT_DIR" |
| 71 | + PATCH_COUNT=0 |
| 72 | +
|
| 73 | + # 根据选择的类型生成补丁 |
| 74 | + if [ "$PATCH_TYPE" = "单个" ]; then |
| 75 | + echo "正在生成单个补丁文件..." |
| 76 | + git diff "$START_HASH" "$END_HASH" > "$OUTPUT_DIR/combined.patch" |
| 77 | + PATCH_COUNT=1 |
| 78 | + echo "已生成单个补丁文件: combined.patch" |
| 79 | + else |
| 80 | + echo "正在生成多个补丁文件..." |
| 81 | + git format-patch "$START_HASH..$END_HASH" -o "$OUTPUT_DIR" --quiet |
| 82 | + PATCH_COUNT=$(ls -1 "$OUTPUT_DIR"/*.patch 2>/dev/null | wc -l) |
| 83 | + echo "已生成 $PATCH_COUNT 个补丁文件" |
| 84 | + fi |
| 85 | +
|
| 86 | + # 设置输出变量 |
| 87 | + echo "patch_dir=$OUTPUT_DIR" >> $GITHUB_OUTPUT |
| 88 | + echo "patch_count=$PATCH_COUNT" >> $GITHUB_OUTPUT |
| 89 | + echo "patch_type=$PATCH_TYPE" >> $GITHUB_OUTPUT |
| 90 | +
|
| 91 | + - name: 创建时间戳命名的 ZIP 文件 |
| 92 | + id: create_zip |
| 93 | + run: | |
| 94 | + # 生成时间戳(年月日_时分秒) |
| 95 | + TIMESTAMP=$(date +"%Y%m%d_%H%M%S") |
| 96 | + ZIP_NAME="patch_$TIMESTAMP.zip" |
| 97 | + |
| 98 | + # 进入补丁目录 |
| 99 | + cd ${{ steps.generate.outputs.patch_dir }} |
| 100 | + |
| 101 | + # 创建 ZIP 文件 |
| 102 | + zip -r "../$ZIP_NAME" . |
| 103 | + |
| 104 | + # 返回上级目录 |
| 105 | + cd .. |
| 106 | + |
| 107 | + # 设置输出变量 |
| 108 | + echo "zip_name=$ZIP_NAME" >> $GITHUB_OUTPUT |
| 109 | + echo "zip_path=$(pwd)/$ZIP_NAME" >> $GITHUB_OUTPUT |
| 110 | + echo "已创建 ZIP 文件: $ZIP_NAME" |
| 111 | +
|
| 112 | + - name: 上传 ZIP 文件到工作流产物 |
| 113 | + uses: actions/upload-artifact@v4 |
| 114 | + with: |
| 115 | + name: git-patches |
| 116 | + path: ${{ steps.create_zip.outputs.zip_path }} |
| 117 | + if-no-files-found: error |
| 118 | + |
| 119 | + - name: 显示结果 |
| 120 | + run: | |
| 121 | + if [ "${{ steps.generate.outputs.patch_type }}" = "单个" ]; then |
| 122 | + echo "成功生成单个补丁文件: combined.patch" |
| 123 | + else |
| 124 | + echo "成功生成 ${{ steps.generate.outputs.patch_count }} 个补丁文件" |
| 125 | + fi |
| 126 | + echo "已创建 ZIP 文件: ${{ steps.create_zip.outputs.zip_name }}" |
| 127 | + echo "补丁文件可在工作流产物中下载" |
0 commit comments