如何在git alias中设置环境变量:执行git status时自动赋值foo=bar
问题解答
为什么Git别名内声明的变量不生效
Git执行自定义别名时,会fork出独立的子shell进程运行别名对应的命令序列,而环境变量、shell自定义变量都是进程隔离的:子进程内对变量的所有修改,仅会作用于子进程自身及其后续派生的孙子进程,执行完成后子进程直接销毁,变量变更完全不会回传给启动Git命令的父shell(也就是你当前正在操作的终端shell)。
你手动输入git status && foo=baz时,整条命令都是在当前shell进程内直接执行的,变量赋值直接修改当前shell的上下文,所以后续echo $foo可以正常拿到值。
为什么Shell层面的Git别名可以正常设置变量
你配置的alias git="foo=bar && git"属于Shell原生别名,完全不涉及Git自身的别名逻辑:
你输入git命令时,Shell会先完成别名替换,把整条命令替换成foo=bar && git 你输入的参数,替换后的整条命令都是在当前shell进程内逐行执行的,foo=bar直接修改当前shell的变量,所以后续echo肯定能拿到值。
实现需求的正确方案
如果要实现每次执行git status就自动给当前shell设置foo=bar,不要用Git别名,改用Shell层面的别名/函数即可,示例:
# 覆盖git命令,仅当子命令为status时赋值 git() { if [ "$1" = "status" ]; then command git "$@" export foo="bar" else command git "$@" fi }
内容的提问来源于stack exchange,提问作者Josh Wren
相关产品推荐
相关产品推荐

