如何编写Bash脚本为连续Git提交信息统一添加前缀?
批量修改Git提交信息前缀的Bash脚本方案
如果你需要批量给连续范围内的Git提交信息统一添加前缀,不用逐个手动确认,下面是两种高效的实现脚本,以及关键注意事项:
方案一:使用git filter-branch(快速修改历史)
这种方式语法简洁,适合快速处理指定范围的提交信息:
完整脚本
#!/bin/bash # 检查参数数量 if [ $# -ne 3 ]; then echo "用法: $0 <起始SHA> <结束SHA> <前缀>" exit 1 fi SHA_START=$1 SHA_END=$2 PREFIX=$3 # 验证传入的SHA是否有效 if ! git rev-parse --verify "$SHA_START" >/dev/null 2>&1; then echo "错误: 起始SHA $SHA_START 无效" exit 1 fi if ! git rev-parse --verify "$SHA_END" >/dev/null 2>&1; then echo "错误: 结束SHA $SHA_END 无效" exit 1 fi # 检查提交范围是否连续(可选提示) if ! git log --oneline "$SHA_START^..$SHA_END" | grep -q "$SHA_START"; then echo "警告: $SHA_START 似乎不是 $SHA_END 的祖先,可能不是连续提交范围" fi # 核心操作:给指定范围的提交信息添加前缀 echo "正在修改提交信息,添加前缀: $PREFIX" git filter-branch --msg-filter "sed 's/^/$PREFIX/'" "$SHA_START^..$SHA_END" echo "修改完成!" echo "注意:此操作重写了提交历史,若分支已推送到远程,需执行 git push --force-with-lease"
使用步骤
- 保存脚本为
rename-git-messages.sh,添加执行权限:chmod +x rename-git-messages.sh - 执行命令:
bash rename-git-messages.sh <sha_start> <sha_end> "my-prefix-"
方案二:使用git rebase(Git推荐工作流)
git filter-branch已被官方标记为过时,推荐用git rebase --exec实现更安全的历史修改:
完整脚本
#!/bin/bash # 检查参数数量 if [ $# -ne 3 ]; then echo "用法: $0 <起始SHA> <结束SHA> <前缀>" exit 1 fi SHA_START=$1 SHA_END=$2 PREFIX=$3 # 获取起始提交的父提交,作为变基起点 PARENT_SHA=$(git rev-parse "$SHA_START^") # 验证父提交是否存在 if ! git rev-parse --verify "$PARENT_SHA" >/dev/null 2>&1; then echo "错误: 起始SHA $SHA_START 没有父提交(可能是初始提交)" exit 1 fi # 批量修改提交信息 echo "正在执行变基并修改提交信息..." git rebase "$PARENT_SHA" "$SHA_END" --exec "git commit --amend -m \"$PREFIX\$(git log --format=%B -n1 HEAD)\" --no-edit" echo "修改完成!" echo "注意:若分支已推送到远程,需执行 git push --force-with-lease"
方案优势
- 遵循Git官方推荐的历史修改流程,风险更低
- 自动维护提交顺序,不会生成冗余的备份分支
关键注意事项
- 禁止在公共分支执行:两种方案都会重写提交历史,会导致其他协作者的本地分支与远程分支冲突
- 先做备份:执行前建议创建备份分支,比如
git branch backup-pre-rename,以防需要回滚 - 合并提交处理:如果提交范围包含合并提交,方案一需添加
--preserve-merges参数,方案二需添加--rebase-merges参数
内容的提问来源于stack exchange,提问作者mcExchange
相关产品推荐
相关产品推荐

