如何配置git继承我特定的$ PATH环境变量?

时间:2014-03-18 08:36:32

标签: macos git bash emacs

我的目标是在我拥有的许多shell帐户之间共享一组点文件,以便我可以在每个帐户中拥有类似的环境。因此,我不想在我的.git文件或我的.bash文件中使用特定于机器/环境的信息。

在我的MacOSX计算机上,默认的emacs版本为22.我已在/usr/local/bin中安装了较新版本的emacs(24)。在我的.bashrc文件中,我将默认编辑器设置为emacs:export EDITOR=emacs。在此之前,我还设置了我的路径,以便/usr/local/bin出现在/usr/bin之前,以便选择较新版本的emacs。

当我使用git创建提交消息时,它总是选择/usr/bin中的那个而不是/usr/local/bin中的那个。 Git忽略了我的$PATH设置。我曾经在我的.gitconfigure文件中硬编码我想要的emacs版本的位置,但是当我在我的Ubuntu服务器上使用相同的.gitconfigure文件时,这不起作用。 (如果不清楚,我所说的是修改我的.gitconfigure编辑器选项以指向硬编码对我来说不起作用。)

为什么git不尊重我的$PATH设置?

如何配置git以使用正确的emacs?


编辑:添加更多上下文

有人建议将环境变量放在.profile/.bash_profile中。以下是我的.bashrc和我的.bash_profile

中的一些相关代码

.bashrc

注意:我写了一个名为vercomp的bash函数来比较版本号。

OS=''                                                                                                
case $OSTYPE in                                                                                      
  darwin*)  OS='Mac' ;;                                                                              
  linux*)   OS='Linux'  ;;                                                                           
  *)        OS='UNKNOWN' ;;                                                                          
esac                                                                                                 

export EDITOR=emacs 

if [[ $OS = 'Mac' ]]; then                                                                           
    ### EMACS VERSION CHECK                                                                          
    # make sure that we're working with emacs >= 24                                                  
    wanted_ver=24                                                                                    
    curr_ver=`emacs --version | grep -oE '[[:digit:]]+\.[.[:digit:]]*'`                              
    vercomp $curr_ver $wanted_ver                                                                    

    # If vercomp returns 2, then our current emacs version isn't good enough.                        
    if [[ $? == 2 ]]; then                                                                           
        if [[ -e '/usr/local/bin/emacs' ]]; then                                                     
            emacs_path='/usr/local/bin/emacs -nw'                                                    
        elif  [[ -e '/Applications/Emacs.app/Contents/MacOS/Emacs' ]]; then                          
            emacs_path='/Applications/Emacs.app/Contents/MacOS/Emacs -nw'                            
        else                                                                                         
            echo -n "EMACS VERSION OUT OF DATE: $curr_emacs_version. "                               
            echo 'Install a newer version.'                                                          
            emacs_path=''                                                                            
        fi                                                                                           
        export EDITOR="$emacs_path"                                                                  
        alias emacs="$emacs_path"                                                                    
    fi                                                                                               
fi 

.bash_profile

source ~/.bashrc                                                                                     
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell         
session *as a function*                                                                              
LESS=-FRX;export LESS  

4 个答案:

答案 0 :(得分:1)

  

我希望有一个答案解释为什么MacOSX不接我的   bashrc / profile环境的变化以及我可以获得的解决方案   MacOSX接受这些变化。

这不是特定于OS X的 - 这是一个例子:

$ uname -a
Linux hostname 3.13.7-gentoo #1 SMP PREEMPT Mon Mar 24 18:40:46 CET 2014 i686 Intel(R) Atom(TM) CPU 330 @ 1.60GHz GenuineIntel GNU/Linux
$ cat .bashrc
export EDITOR="emacs"
$ echo $EDITOR
/usr/bin/vim
$ mv .bashrc .bash_profile
$ logout
Connection to hostname closed.
$ ssh hostname
$ echo $EDITOR
emacs

我知道并习惯“生活”的是环境变量应该驻留在/etc/profile(系统范围)内,并且可以在~/.profile内分别在用户级别进行扩展和覆盖{ {1}}。

来自man bash

  

当bash被调用为交互式登录shell时,或者作为   使用--login选项的非交互式shell,它首先读取   并执行文件/ etc / profile中的命令,如果该文件   存在。读完该文件后,它会查找〜/ .bash_profile,   〜/ .bash_login和〜/ .profile,按顺序,并读取和   从第一个存在且可读的命令执行命令。

另一方面。 ~/.bash_profile是放置自定义函数,别名,提示配置等的地方。

对于您的具体问题,一个简单的解决方案 - 除了在您的特殊情况下使用另一个git版本 - 只需将您的环境变量从.bashrc移动到.bashrc

Linux From Scratch项目提供了一些非常好的examples about how to organize the bash shell startup files。 OS X中的特定问题在"Setting environment variables in OS X?"内解决。

答案 1 :(得分:0)

.bashrc中设置变量。 Bash只在交互式会话中查看此文件,因此交互式会话之外的程序永远不会看到.bashrc.

中的任何变量

对于bash,环境变量属于~/.profile !。

要立即解决问题,您可以将$EDITOR设置为绝对路径:

if [[ -e /usr/local/bin/emacs ]]; then
  export EMACS=/usr/local/bin/emacs
else
  export EMACS=emacs

但是,问题指出了环境设置中存在的更深层次问题,但您的问题目前缺少一些信息(请参阅我的评论)。

通常,$PATH和环境变量在OS X上是混乱的,因为没有一个地方可以更改它们(例如,配置文件变量不会传播到桌面和GUI应用程序),并且因为OS X本身通过$PATHpath_helper进行对话。您需要特别注意设置变量的位置,并且需要使用exec-path-from-shell之类的解决方法来使您的环境变量在GUI应用程序中可用。

答案 2 :(得分:0)

任何程序都可以自由地将PATH设置为自己想要的内容 - 这种策略通常用于setuid程序,以防止执行错误(或彻头彻尾的坏)可执行文件。

您需要了解Emacs Terminal.app 是否会创建一个运行~/.bashrc~/.bash_profile,两者或其他内容的Bash。 (对不起,我是vim用户。)

答案 3 :(得分:-1)

试试这个:

export VISUAL=emacs

我刚从我的Ubuntu上的bash尝试export VISUAL=gedit,现在git使用gedit 当从该终端呼叫时。