#!/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-Id(SHA1 本身就是唯一的) # 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