Files
gerrit/正确修复Change-Id.sh

84 lines
2.3 KiB
Bash
Raw Normal View History

2025-12-22 17:12:39 +08:00
#!/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