如何在Git Bash(VIM环境)自动填充含上次合并后提交的合并信息?
实现自动填充Merge Commit Message的方法
当然可以实现!你要的这种自动填充merge commit message的需求,用Git的prepare-commit-msg钩子就能搞定——它会在VIM打开编辑commit message之前自动运行,帮你生成符合要求的内容。下面是具体的操作步骤:
1. 创建钩子文件
进入你的Git仓库根目录,找到.git/hooks文件夹(默认是隐藏的,用ls -la就能看到)。里面默认有个prepare-commit-msg.sample示例文件,我们需要新建一个不带.sample后缀的prepare-commit-msg文件:
cd .git/hooks touch prepare-commit-msg chmod +x prepare-commit-msg # 给文件加上执行权限,不然Git没法运行它
2. 写入钩子脚本
用VIM打开这个新文件:
vim prepare-commit-msg
然后把下面的bash脚本粘贴进去(按i进入插入模式,粘贴完按Esc,输入:wq保存退出):
#!/bin/bash # 只针对merge commit触发逻辑 if [ "$2" = "merge" ]; then # 获取当前分支和要合并的分支名称 CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) MERGED_BRANCH=$(git rev-parse --abbrev-ref MERGE_HEAD) # 找到上次merge的commit记录;如果是仓库第一次merge,就取初始commit LAST_MERGE_COMMIT=$(git log --merges --pretty=format:"%H" -1 HEAD^) if [ -z "$LAST_MERGE_COMMIT" ]; then LAST_MERGE_COMMIT=$(git rev-list --max-parents=0 HEAD) fi # 抓取上次merge之后到当前HEAD的所有非merge commit的message COMMIT_LIST=$(git log --pretty=format:"%s" $LAST_MERGE_COMMIT..HEAD --no-merges) # 生成你想要的merge commit message并写入临时文件 cat > "$1" <<EOF Merged $MERGED_BRANCH to $CURRENT_BRANCH : $COMMIT_LIST EOF fi
3. 测试效果
现在当你执行git merge [你的目标分支](比如git merge BranchA,假设当前在BranchB),Git会自动生成符合你要求的commit message,然后打开VIM让你确认。比如上次merge后有3条commit,VIM里会显示:
Merged BranchA to BranchB :
Commit A - did A stuff
Commit B - did B stuff
Commit C - did C stuff
你直接输入:wq保存退出就能完成合并,要是想修改内容也可以直接在VIM里编辑后再提交。
小提示
- 这个钩子只对当前仓库生效,要是其他仓库也想用,把
.git/hooks/prepare-commit-msg文件复制过去就行。 - 如果你的仓库是第一次做merge(没有历史merge记录),脚本会自动取仓库的第一个commit作为起点,列出所有非merge类型的commit。
内容的提问来源于stack exchange,提问作者KlapekApokalipsy
相关产品推荐
相关产品推荐

