#!/bin/bash # 正确修复 Change-Id:每个提交使用自己的 SHA1 echo "==========================================" echo "正确修复 Change-Id - 每个提交使用自己的 SHA1" echo "==========================================" echo "" cd /d/zhini/zhini_im || exit 1 # 1. 清理备份 echo "步骤 1: 清理 filter-branch 备份..." git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true echo "✅ 清理完成" echo "" # 2. 创建新备份 echo "步骤 2: 创建备份..." BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" git branch "$BACKUP_BRANCH" echo "✅ 备份分支: $BACKUP_BRANCH" echo "" # 3. 修复 Change-Id echo "步骤 3: 为每个提交生成唯一的 Change-Id..." echo "关键:使用 \$GIT_COMMIT 环境变量(正在处理的提交的 SHA1)" echo "" # 设置环境变量以消除警告 export FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --msg-filter ' # 读取原始提交信息 ORIGINAL=$(cat) # 移除旧的 Change-Id CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") # 输出清理后的提交信息 echo "$CLEAN" # 关键:使用 $GIT_COMMIT 环境变量,它包含正在被处理的提交的 SHA1 # 而不是使用 git rev-parse HEAD(那会返回当前 HEAD) CURRENT_COMMIT="${GIT_COMMIT}" # 为当前提交生成唯一的 Change-Id CHANGE_ID="I${CURRENT_COMMIT}" echo "" echo "Change-Id: $CHANGE_ID" ' --tag-name-filter cat -- --branches --tags if [ $? -eq 0 ]; then echo "" echo "✅ Change-Id 修复完成!" echo "" # 验证 echo "步骤 4: 验证 Change-Id 唯一性..." DUPLICATES=$(git log --format='%H' | while read commit; do git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 done | sort | uniq -d) if [ -z "$DUPLICATES" ]; then echo "✅ 所有 Change-Id 都是唯一的!" echo "" echo "现在可以推送:" echo " git push gerrit HEAD:refs/for/master" else echo "⚠️ 仍有重复的 Change-Id:" echo "$DUPLICATES" echo "" echo "请检查并重试" fi else echo "" echo "❌ 修复失败" echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" exit 1 fi