使用git filter-branch修改提交者信息时遭遇语法错误求助
解决git filter-branch修改提交者信息的语法错误问题
嘿,我看你在尝试用git filter-branch批量修改提交者姓名和邮箱时遇到了语法报错,咱们来一步步解决这个问题~
问题出在哪?
你遇到的Syntax error: end of file unexpected (expecting ")")错误,核心原因是shell命令的分隔格式不对。你的脚本里把多个export命令和最后的git commit-tree挤在了一行,而且缺少必要的分隔符(分号或者换行),导致shell没办法正确解析每个命令的边界,读到文件末尾还没找到预期的括号,就报错了。另外,脚本里的<是HTML转义后的小于号,shell其实不认识这个,得换成原生的<才行。
修正后的可用脚本
我把你的脚本调整了格式,修复了这些问题,你直接运行这个版本应该就能正常工作了:
git filter-branch --commit-filter ' export GIT_AUTHOR_NAME=$(sed -r "s/\<./\U&/g" <<< "$GIT_AUTHOR_NAME") export GIT_AUTHOR_EMAIL=$(sed "s/@[^@]*@foo.net/" <<< "$GIT_COMMITTER_EMAIL") export GIT_COMMITTER_NAME=$(sed -r "s/\<./\U&/g" <<< "$GIT_AUTHOR_NAME") export GIT_COMMITTER_EMAIL=$(sed "s/@[^@]*@foo.net/" <<< "$GIT_COMMITTER_EMAIL") git commit-tree "$@" '
关键修改细节
- 把每个命令拆到单独的行,让shell能清晰识别每个命令的结束位置,不用靠转义来挤在一行
- 给所有变量加上双引号(比如
"$GIT_AUTHOR_NAME"),避免提交者姓名里有空格时出现解析错误 - 把HTML转义的
<换回shell能识别的< - 去掉了多余的转义符号,让命令结构更清晰
额外小提示
如果你的系统用的是比较旧的shell(比如不支持<<<这种here-string语法),可以把sed部分改成管道方式:
export GIT_AUTHOR_NAME=$(echo "$GIT_AUTHOR_NAME" | sed -r "s/\<./\U&/g")
另外提一句,git官方现在已经标记git filter-branch为废弃状态了,更推荐用git filter-repo来做这类历史提交修改的操作,不过如果暂时还在使用filter-branch,上面的修正应该能完美解决你的问题~
内容的提问来源于stack exchange,提问作者kiblik1




