Files
gerrit/add_changeid.sh

135 lines
3.7 KiB
Bash
Raw Normal View History

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