git tree branch接缝完全没有效果

时间:2018-05-31 14:24:35

标签: bash git git-filter-branch

您好我想更改电子邮件域并将提交者名称中的第一个字母大写,但它接缝不起作用,捕获的位置在哪里?谢谢。

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"

1 个答案:

答案 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。