You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用git filter-branch修改提交者信息时遭遇语法错误求助

解决git filter-branch修改提交者信息的语法错误问题

嘿,我看你在尝试用git filter-branch批量修改提交者姓名和邮箱时遇到了语法报错,咱们来一步步解决这个问题~

问题出在哪?

你遇到的Syntax error: end of file unexpected (expecting ")")错误,核心原因是shell命令的分隔格式不对。你的脚本里把多个export命令和最后的git commit-tree挤在了一行,而且缺少必要的分隔符(分号或者换行),导致shell没办法正确解析每个命令的边界,读到文件末尾还没找到预期的括号,就报错了。另外,脚本里的&lt;是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转义的&lt;换回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

火山引擎 最新活动