通过shell脚本读取的git命令的输出在再次传递给另一个git命令时添加特殊字符

时间:2018-04-11 10:13:53

标签: bash git shell git-bash

我要求删除最近离开该组织的开发人员的git存储库中的分支。所以我使用git for-each-ref列出所有分支,然后使用grep按开发者名称过滤结果(以下脚本中的test_developer)。我使用shell read和extract分支到变量mybr并使用git push origin --delete来删除分支。请在下面找到代码段:

git for-each-ref --format='%(align:1,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authorname refs/remotes | grep test_developer | while read line;do mystr=(${line}); mybr=${mystr[1]}; git push origin --delete "$mybr"; done

问题是输出为“致命:refspec的远程部分不是有效名称:?[mbugfix / CRIP-2475”。这里的bugfix / CRIP-2475是分支名称。我想知道那些额外的字符是什么:?[m在分支名称之前附加了。

如果我在git delete之前回显$ mybr,我会将值正确打印为“bugfix / CRIP-2475”。如果我手动将此值传递给git delete,它工作正常。但是当它作为变量传递时,我得到上述错误。我怀疑有一些特殊的字符被预先添加,可能是一个ctrlM字符或回声没有打印到屏幕上的东西。

有没有删除那些额外的字符?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用Bash sub-string replacement

删除

${str/#find/replace}用于替换预修复字符

${str/%find/replace}用于替换修复后字符

git for-each-ref --format='%(align:1,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authorname refs/remotes | grep test_developer | while read line;do mystr=(${line}); mybr=${mystr[1]}; git push origin --delete "${mybr/#?[m/}"; done

答案 1 :(得分:1)

这些“神奇”符号当然是colors。你喊'在管道中使用颜色:

git for-each-ref --format='%(align:1,left)%(authorname)%(end) %(refname:strip=3)' --sort=authorname refs/remotes | …