You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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
脚本说明
  1. 容错处理:先检查是否在Git仓库、master分支是否存在,避免无效场景下报错。
  2. 精准过滤:通过merge_base确保只处理master分支之后的提交,不会包含master上的历史提交。
  3. 前缀提取逻辑:用awk过滤掉没有冒号的提交(如果不需要过滤,可去掉if(NF>=2)条件),只保留符合格式的前缀。
  4. 交互式确认:提交前先预览信息,避免误提交。
可选扩展

如果需要对前缀去重(比如同一前缀多次出现只保留一次),可以在提取前缀的步骤中加入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:07:38