Files
gerrit/fix_unique_changeid.sh
2025-12-22 17:12:39 +08:00

92 lines
2.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 为所有提交生成唯一 Change-Id 的脚本
echo "=========================================="
echo "为所有提交生成唯一的 Change-Id"
echo "=========================================="
echo ""
cd /d/zhini/zhini_im || exit 1
# 1. 确保 hook 已安装
echo "步骤 1: 确保 commit-msg hook 已安装..."
mkdir -p .git/hooks
curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg 2>/dev/null
chmod +x .git/hooks/commit-msg
echo "✅ Hook 已安装"
echo ""
# 2. 创建备份
echo "步骤 2: 创建备份分支..."
BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)"
git branch "$BACKUP_BRANCH"
echo "✅ 备份分支: $BACKUP_BRANCH"
echo ""
# 3. 检查当前有多少个提交
TOTAL_COMMITS=$(git rev-list --count HEAD)
echo "步骤 3: 找到 $TOTAL_COMMITS 个提交需要处理"
echo ""
# 4. 为所有提交生成唯一的 Change-Id
echo "步骤 4: 为所有提交生成唯一的 Change-Id..."
echo "这可能需要一些时间,请耐心等待..."
echo ""
# 使用 filter-branch为每个提交生成基于其唯一信息的 Change-Id
git filter-branch -f --msg-filter '
# 读取原始提交信息
ORIGINAL_MSG=$(cat)
# 移除所有旧的 Change-Id 行
CLEAN_MSG=$(echo "$ORIGINAL_MSG" | grep -v "^Change-Id:")
# 输出清理后的提交信息(去除末尾多余空行)
echo "$CLEAN_MSG" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//"
# 为当前提交生成唯一的 Change-Id
# 使用提交的完整 SHA1每个提交的 SHA1 都是唯一的)
COMMIT_SHA=$(git rev-parse HEAD)
# 直接使用 SHA1 作为 Change-IdSHA1 本身就是唯一的)
# Change-Id 格式I + 40位十六进制
CHANGE_ID="I${COMMIT_SHA}"
echo ""
echo "Change-Id: $CHANGE_ID"
' --tag-name-filter cat -- --branches --tags
if [ $? -eq 0 ]; then
echo ""
echo "✅ Change-Id 生成完成!"
echo ""
# 验证所有 Change-Id 都是唯一的
echo "步骤 5: 验证 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 都是唯一的"
else
echo "⚠️ 发现重复的 Change-Id:"
echo "$DUPLICATES"
fi
echo ""
echo "下一步:"
echo " git push gerrit HEAD:refs/for/master"
echo ""
echo "如果需要恢复,可以使用:"
echo " git reset --hard $BACKUP_BRANCH"
else
echo ""
echo "❌ 生成 Change-Id 失败"
echo "可以恢复备份git reset --hard $BACKUP_BRANCH"
exit 1
fi