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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:14:52