您好我想更改电子邮件域并将提交者名称中的第一个字母大写,但它接缝不起作用,捕获的位置在哪里?谢谢。
cmd=$(
GIT_AUTHOR_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_AUTHOR_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
GIT_COMMITTER_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_COMMITTER_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
git commit-tree "$@"
)
git filter-branch --env-filter "$cmd"
答案 0 :(得分:0)
首先,您的--env-filter
无需致电git commit-tree
。它只需要更新环境。
除此之外,问题是你的shell脚本语法。当你说
cmd=$(
GIT_AUTHOR_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_AUTHOR_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
GIT_COMMITTER_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_COMMITTER_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
)
这意味着要立即运行
GIT_AUTHOR_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_AUTHOR_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
GIT_COMMITTER_NAME=$(sed -r 's/\<./\U&/g' <<<"$GIT_AUTHOR_NAME")
GIT_COMMITTER_EMAIL=$(sed 's/@[^,]*/@foo.net/' <<<"$GIT_COMMITTER_EMAIL")
并将变量cmd
设置为运行这些命令的输出。
我不确定在变量中构建过滤器脚本是我要做的,但是如果你想要这样做,这将更好用
cmd='GIT_AUTHOR_NAME=$(sed -r "s/\<./\U&/g" <<<"$GIT_AUTHOR_NAME");
GIT_AUTHOR_EMAIL=$(sed "s/@[^,]*/@foo.net/" <<<"$GIT_COMMITTER_EMAIL");
GIT_COMMITTER_NAME=$(sed -r "s/\<./\U&/g" <<<"$GIT_AUTHOR_NAME");
GIT_COMMITTER_EMAIL=$(sed "s/@[^,]*/@foo.net/" <<<"$GIT_COMMITTER_EMAIL");'
git filter-branch --env-filter "$cmd"
请注意更改的引号('...'
而不是$(...)
作为整体脚本; "
代替'
脚本,因为没有理由跳过箍使用'
那里)和添加的;
s
更新 - 为了澄清后代 - 我在上面提出的语法在运行git bash
的Windows系统上进行了测试。原始问题中的脚本语法类似于bash语法,而bash对于git环境来说是典型的,所以这就是我所假设的。
从评论来看,似乎OP正在使用其他东西(我仍然不知道是什么)无法处理该语法;但发现建议的语法也适用于zsh。