Bash中由Git别名引起的变量命名不当问题

3

我在我的全局git配置中有以下Git别名。

pushnew = !f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git push --set-upstream origin $tmp_branch; unset $tmp_branch; }; f

运行时会得到以下输出:

 * [new branch]      bug/graphs -> bug/graphs
Branch bug/graphs set up to track remote branch bug/graphs from origin.
f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git push --set-upstream origin $tmp_branch; unset $tmp_branch; }; f: 1: unset: bug/graphs: bad variable name

我看到了这个问题,但如果那是解决方案,那么在Git别名上如何应用这个修复?


2
我猜在这种情况下不会有太大问题,但你应该始终引用你的 shell 变量,例如 git push --set-upstream origin "$tmp_branch"。这可以防止单词拆分,当变量值中有空格时,以及通配符扩展,当存在像 * 这样的字符时。 - Tom Fenech
2
如果您想查找当前分支名称,您不希望从git branch的输出中使用grep命令。您需要使用git symbolic-ref HEAD(可能还要使用--short参数)。请参阅https://dev59.com/5HI-5IYBdhLWcg3w9thw。 - Etan Reisner
Tom,Etan:感谢你们的建议 - 我一定会改进它并有助于未来的维护。 - bcmcfc
没有真正的必要取消设置 tmp_branch,因为它是由 Git 创建的子 shell 中定义的。也没有必要导出它;您只需要在定义它的同一 shell 中扩展它,而不是在子进程中。f() { git push --set-upstream origin "$(git symbolic-ref HEAD)"; } 应该就足够了。 - chepner
1个回答

4

应该是:

unset tmp_branch

如果你尝试取消设置 $tmp_branch,shell会用 $tmp_branch 的值进行替换,试图取消设置 bug/graphs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接