如何编写Bash脚本实现新分支提交信息包含master分支末次提交后的所有提交前缀?
我来帮你搞定这个脚本!核心思路是先定位当前分支和master的分叉点,提取分叉后所有提交的前缀,再把这些前缀拼接成新的提交信息。下面是具体的实现步骤和可直接使用的脚本:
实现思路
- 定位分叉点:用
git merge-base master HEAD找到当前分支与master的最近共同祖先,这个点就是master最后一次提交后,当前分支开始新增提交的节点。 - 提取提交主题:列出从分叉点到当前分支末端的所有提交的主题内容。
- 提取前缀:对每个提交主题,截取冒号
:之前的部分作为前缀。 - 拼接前缀:把所有提取到的前缀拼接成一个字符串,作为新提交的信息。
- 交互式提交:先让你预览提交信息,确认后再执行提交操作,避免误操作。
完整脚本代码
#!/bin/bash # 检查当前是否在Git仓库内 if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then echo "❌ 错误:当前目录不是Git仓库,请切换到仓库目录后重试!" exit 1 fi # 检查master分支是否存在 if ! git show-ref --verify --quiet refs/heads/master; then echo "❌ 错误:当前仓库中不存在master分支!" exit 1 fi # 找到当前分支与master的最近共同祖先(分叉点) merge_base=$(git merge-base master HEAD) # 检查当前分支是否和master完全一致(没有新增提交) if [ "$merge_base" = "$(git rev-parse HEAD)" ]; then echo "ℹ️ 提示:当前分支与master分支无差异,没有可提取的前缀。" exit 0 fi # 提取分叉后所有提交的前缀:先取提交主题,再按冒号分割取第一部分,最后拼接成空格分隔的字符串 prefixes=$(git log --pretty=format:"%s" "$merge_base..HEAD" \ | awk -F: '{if(NF>=2) print $1}' \ # 只保留有冒号的提交前缀 | tr '\n' ' ' \ | sed 's/ $//') # 去掉末尾多余的空格 # 检查是否提取到有效前缀 if [ -z "$prefixes" ]; then echo "ℹ️ 提示:分叉后的提交均不符合<prefix>:<msg>格式,没有可提取的前缀。" exit 0 fi # 预览提交信息并确认 echo "📋 即将生成的提交信息:$prefixes" read -p "是否执行提交?(y/n): " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then git commit -m "$prefixes" echo "✅ 提交成功!" else echo "🔴 已取消提交。" exit 0 fi
脚本说明
- 容错处理:先检查是否在Git仓库、master分支是否存在,避免无效场景下报错。
- 精准过滤:通过
merge_base确保只处理master分支之后的提交,不会包含master上的历史提交。 - 前缀提取逻辑:用
awk过滤掉没有冒号的提交(如果不需要过滤,可去掉if(NF>=2)条件),只保留符合格式的前缀。 - 交互式确认:提交前先预览信息,避免误提交。
可选扩展
如果需要对前缀去重(比如同一前缀多次出现只保留一次),可以在提取前缀的步骤中加入sort -u:
prefixes=$(git log --pretty=format:"%s" "$merge_base..HEAD" \ | awk -F: '{if(NF>=2) print $1}' \ | sort -u \ # 新增去重 | tr '\n' ' ' \ | sed 's/ $//')
内容的提问来源于stack exchange,提问作者cincin21
相关产品推荐
相关产品推荐

