#!/bin/bash # 为所有 Git 提交添加 Change-Id 的脚本 echo "==========================================" echo "为所有提交添加 Change-Id" echo "==========================================" echo "" # 检查是否在 Git 仓库中 if [ ! -d .git ]; then echo "❌ 错误:当前目录不是 Git 仓库" exit 1 fi # 步骤 1:安装 commit-msg hook echo "步骤 1: 安装 commit-msg hook..." echo "" GIT_DIR=$(git rev-parse --git-dir) HOOK_PATH="$GIT_DIR/hooks/commit-msg" # 尝试使用 scp 下载 echo "尝试使用 SCP 下载 hook..." scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg "$HOOK_PATH" 2>/dev/null # 如果 scp 失败,使用 curl if [ ! -f "$HOOK_PATH" ] || [ ! -x "$HOOK_PATH" ]; then echo "SCP 失败,尝试使用 curl..." mkdir -p "$GIT_DIR/hooks" curl -o "$HOOK_PATH" http://101.43.95.130:8080/tools/hooks/commit-msg 2>/dev/null chmod +x "$HOOK_PATH" fi if [ -f "$HOOK_PATH" ] && [ -x "$HOOK_PATH" ]; then echo "✅ commit-msg hook 安装成功" else echo "❌ commit-msg hook 安装失败" echo "请手动下载:" echo " curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg" echo " chmod +x .git/hooks/commit-msg" exit 1 fi echo "" # 步骤 2:检查有多少提交缺少 Change-Id echo "步骤 2: 检查缺少 Change-Id 的提交..." echo "" MISSING_COUNT=0 git log --format='%H' | while read commit; do if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then MISSING_COUNT=$((MISSING_COUNT + 1)) fi done # 由于管道,MISSING_COUNT 在子 shell 中,需要重新计算 MISSING_COUNT=$(git log --format='%H' | while read commit; do if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then echo "1" fi done | wc -l) if [ "$MISSING_COUNT" -eq 0 ]; then echo "✅ 所有提交都已包含 Change-Id" exit 0 fi echo "找到 $MISSING_COUNT 个缺少 Change-Id 的提交" echo "" # 步骤 3:创建备份 BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" echo "步骤 3: 创建备份分支: $BACKUP_BRANCH" git branch "$BACKUP_BRANCH" echo "✅ 备份完成" echo "" # 步骤 4:为所有提交添加 Change-Id echo "步骤 4: 为所有提交添加 Change-Id..." echo "这可能需要一些时间,请耐心等待..." echo "" # 使用 git filter-branch 为所有提交添加 Change-Id git filter-branch -f --msg-filter ' # 读取原始提交信息 cat # 如果提交信息中没有 Change-Id,添加一个 if ! grep -q "^Change-Id:"; then # 生成 Change-Id(基于提交的 SHA1) # 使用 git hash-object 生成一个唯一的 ID COMMIT_INFO=$(git cat-file commit HEAD) CHANGE_ID_BASE=$(echo -n "$COMMIT_INFO" | git hash-object --stdin) CHANGE_ID="I${CHANGE_ID_BASE:0:40}" echo "" echo "Change-Id: $CHANGE_ID" fi ' --tag-name-filter cat -- --branches --tags if [ $? -eq 0 ]; then echo "" echo "✅ Change-Id 添加完成!" echo "" # 验证 echo "验证结果:" REMAINING=$(git log --format='%H' | while read commit; do if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then echo "1" fi done | wc -l) if [ "$REMAINING" -eq 0 ]; then echo "✅ 所有提交都已包含 Change-Id" else echo "⚠️ 仍有 $REMAINING 个提交缺少 Change-Id" 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