@@ -34,20 +34,30 @@ jobs:
3434
3535 - name : 准备环境
3636 run : |
37+ # 创建必要的目录
3738 mkdir -p source_repo patches
3839 echo "准备完成"
40+ echo "当前工作目录: $(pwd)"
41+ echo "目录结构:"
42+ ls -la
3943
4044 - name : 克隆源仓库
4145 run : |
46+ echo "正在克隆源仓库..."
47+ echo "仓库URL: ${{ github.event.inputs.repo_url }}"
48+ echo "分支: ${{ github.event.inputs.branch || '默认分支' }}"
49+
4250 cd source_repo
43- # 使用轻量克隆
51+
52+ CLONE_CMD="git clone --depth 100 --single-branch"
4453 if [ -n "${{ github.event.inputs.branch }}" ]; then
45- echo "正在克隆 ${{ github.event.inputs.repo_url }} 的分支: ${{ github.event.inputs.branch }}"
46- git clone --depth 100 --single-branch --branch "${{ github.event.inputs.branch }}" "${{ github.event.inputs.repo_url }}" .
54+ $CLONE_CMD --branch "${{ github.event.inputs.branch }}" "${{ github.event.inputs.repo_url }}" .
4755 else
48- echo "正在克隆 ${{ github.event.inputs.repo_url }} 的默认分支"
49- git clone --depth 100 --single-branch "${{ github.event.inputs.repo_url }}" .
56+ $CLONE_CMD "${{ github.event.inputs.repo_url }}" .
5057 fi
58+
59+ echo "克隆完成,当前分支: $(git branch --show-current)"
60+ echo "最近提交: $(git log -1 --oneline)"
5161
5262 - name : 生成补丁文件
5363 id : generate
5969 START_HASH=$(git rev-parse "${{ github.event.inputs.start_commit }}")
6070 END_HASH=$(git rev-parse "${{ github.event.inputs.end_commit }}")
6171
72+ echo "起始提交哈希: $START_HASH"
73+ echo "结束提交哈希: $END_HASH"
74+
6275 # 验证提交是否存在
6376 if ! git rev-parse --verify "$START_HASH" >/dev/null 2>&1; then
6477 echo "::error::起始提交 '${{ github.event.inputs.start_commit }}' 不存在"
7083 exit 1
7184 fi
7285
86+ # 检查提交顺序
87+ if git merge-base --is-ancestor "$END_HASH" "$START_HASH"; then
88+ echo "::warning::提交顺序可能颠倒,交换起始和结束提交"
89+ TEMP_HASH=$START_HASH
90+ START_HASH=$END_HASH
91+ END_HASH=$TEMP_HASH
92+ fi
93+
7394 # 创建输出目录
7495 OUTPUT_DIR="../../patches"
7596 mkdir -p "$OUTPUT_DIR"
@@ -78,38 +99,85 @@ jobs:
7899 # 根据选择的类型生成补丁
79100 if [ "${{ github.event.inputs.patch_type }}" = "单个" ]; then
80101 echo "正在生成单个补丁文件..."
81- git diff "$START_HASH" "$END_HASH" > "$OUTPUT_DIR/combined.patch"
82- PATCH_COUNT=1
83- echo "已生成单个补丁文件: combined.patch"
102+ git diff "$START_HASH" "$END_HASH" > "$OUTPUT_DIR/combined.patch" || echo "生成单个补丁失败"
103+
104+ if [ -s "$OUTPUT_DIR/combined.patch" ]; then
105+ PATCH_COUNT=1
106+ echo "已生成单个补丁文件: combined.patch"
107+ else
108+ echo "::warning::生成的单个补丁文件为空"
109+ fi
84110 else
85111 echo "正在生成多个补丁文件..."
86- # 检查是否需要获取更多历史
87- if ! git merge-base --is-ancestor "$START_HASH" "$END_HASH" 2>/dev/null; then
88- echo "提交范围不在当前克隆深度内,获取更多历史..."
89- git fetch --depth=1000
112+
113+ # 检查提交范围是否有效
114+ COMMIT_RANGE="$START_HASH..$END_HASH"
115+ echo "提交范围: $COMMIT_RANGE"
116+
117+ # 获取提交数量
118+ COMMIT_COUNT=$(git rev-list --count $COMMIT_RANGE || echo 0)
119+ echo "范围内提交数量: $COMMIT_COUNT"
120+
121+ if [ "$COMMIT_COUNT" -eq 0 ]; then
122+ echo "::warning::提交范围内没有提交,尝试交换顺序..."
123+ COMMIT_RANGE="$END_HASH..$START_HASH"
124+ COMMIT_COUNT=$(git rev-list --count $COMMIT_RANGE || echo 0)
125+ echo "交换后范围内提交数量: $COMMIT_COUNT"
126+ fi
127+
128+ if [ "$COMMIT_COUNT" -gt 0 ]; then
129+ # 确保有足够的历史
130+ CURRENT_DEPTH=$(git rev-list --count HEAD)
131+ if [ "$COMMIT_COUNT" -gt $CURRENT_DEPTH ]; then
132+ echo "需要更多历史记录,当前深度: $CURRENT_DEPTH, 需要: $COMMIT_COUNT"
133+ git fetch --depth=$((COMMIT_COUNT + 10))
134+ fi
135+
136+ # 生成补丁
137+ git format-patch $COMMIT_RANGE -o "$OUTPUT_DIR" --quiet
138+ PATCH_COUNT=$(ls -1 "$OUTPUT_DIR"/*.patch 2>/dev/null | wc -l)
139+ echo "已生成 $PATCH_COUNT 个补丁文件"
140+ else
141+ echo "::error::提交范围内没有有效的提交"
142+ echo "起始提交: $(git show -s --format='%h %s' $START_HASH)"
143+ echo "结束提交: $(git show -s --format='%h %s' $END_HASH)"
144+ exit 1
90145 fi
91- git format-patch "$START_HASH..$END_HASH" -o "$OUTPUT_DIR" --quiet
92- PATCH_COUNT=$(ls -1 "$OUTPUT_DIR"/*.patch 2>/dev/null | wc -l)
93- echo "已生成 $PATCH_COUNT 个补丁文件"
94146 fi
95147
96148 # 设置输出变量
97149 echo "patch_dir=../patches" >> $GITHUB_OUTPUT
98150 echo "patch_count=$PATCH_COUNT" >> $GITHUB_OUTPUT
99151 echo "patch_type=${{ github.event.inputs.patch_type }}" >> $GITHUB_OUTPUT
100152
153+ - name : 检查补丁文件
154+ run : |
155+ echo "检查补丁目录内容..."
156+ echo "补丁目录路径: $(pwd)/patches"
157+ ls -la patches || echo "补丁目录不存在"
158+
159+ if [ -d "patches" ]; then
160+ echo "补丁文件列表:"
161+ ls -l patches/*.patch 2>/dev/null || echo "没有找到补丁文件"
162+ fi
163+
101164 - name : 创建时间戳命名的 ZIP 文件
102165 id : create_zip
103166 run : |
104167 # 检查补丁目录是否存在
105168 if [ ! -d "patches" ]; then
106- echo "::error::补丁目录不存在,请检查生成步骤 "
169+ echo "::error::补丁目录不存在"
107170 exit 1
108171 fi
109172
110173 # 检查是否有补丁文件
111- if [ -z "$(ls -A patches)" ]; then
112- echo "::error::补丁目录为空,没有生成补丁文件"
174+ PATCH_FILES=$(ls patches/*.patch 2>/dev/null | wc -l)
175+ if [ "$PATCH_FILES" -eq 0 ]; then
176+ echo "::error::没有生成任何补丁文件"
177+ echo "可能原因:"
178+ echo "1. 起始提交和结束提交相同"
179+ echo "2. 提交顺序错误"
180+ echo "3. 提交范围内没有变更"
113181 exit 1
114182 fi
115183
0 commit comments