Git BASH合并时prepare-commit-msg钩子丢失换行符问题求助
Git prepare-commit-msg钩子换行符丢失问题解决办法
在使用prepare-commit-msg钩子自动给提交信息前置分支名时,执行git merge会出现换行符丢失的问题,导致Git自动添加的冲突注释行全部挤成一行。
原脚本问题
原使用的脚本如下:
#!/bin/sh NAME=$(git branch | grep '*' | sed 's/* //') echo "$NAME"' - '$(cat "$1") > "$1"
实际生成的提交信息
my_branch_name - Merge branch 'master' into my_branch_name # Conflicts: # File1.txt # File2.txt # File3.txt
期望的提交信息
my_branch_name - Merge branch 'master' into my_branch_name # Conflicts: # File1.txt # File2.txt # File3.txt
问题原因
原脚本中使用$(cat "$1")进行命令替换时,Shell会把文件内容里的换行符替换成空格,导致所有内容被合并成单行输出,破坏了原有的注释行格式。
解决办法
改用直接操作文件内容的方式,只在第一行前添加分支名前缀,保留原有的换行结构。推荐两种实现方式:
方式1:使用sed(兼容MacOS和Linux)
#!/bin/sh # 获取当前分支名(Git 2.22+支持,比grep更可靠) NAME=$(git branch --show-current) # 在第一行开头插入分支名前缀,.bak是MacOS下sed的备份文件后缀,Linux可省略 sed -i.bak "1s/^/$NAME - /" "$1" # 删除备份文件 rm -f "$1.bak"
方式2:使用awk
#!/bin/sh NAME=$(git branch --show-current) # 第一行添加前缀,其余行保持原样输出 awk -v prefix="$NAME - " 'NR==1{print prefix $0; next}1' "$1" > "$1.tmp" && mv "$1.tmp" "$1"
这两种方法都会保留提交信息文件中原有的所有换行符,只修改第一行内容,完美解决merge时注释行挤成一行的问题。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

