Files
gerrit/fix_unique_changeid.sh

92 lines
2.6 KiB
Bash
Raw Normal View History

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