我的 .bashrc 文件在 Git Bash 启动时没有被执行(Windows 7)

13

这是我所做的:

cd ~
touch .bashrc
notepad .bashrc

我的.bashrc文件的内容是从网上某处找来的:

SSH_ENV="$HOME/.ssh/environment"

# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
    echo succeeded
    chmod 600 "$SSH_ENV"
    . "$SSH_ENV" > /dev/null
    ssh-add
}

# test for identities
function test_identities {
    # test whether standard identities have been added to the agent already
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $? -eq 0 ]; then
        ssh-add
        # $SSH_AUTH_SOCK broken so we start a new proper agent
        if [ $? -eq 2 ];then
            start_agent
        fi
    fi
}

# check for running ssh-agent with proper $SSH_AGENT_PID
if [ -n "$SSH_AGENT_PID" ]; then
    ps -ef | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
    test_identities
    fi
# if $SSH_AGENT_PID is not properly set, we might be able to load one from
# $SSH_ENV
else
    if [ -f "$SSH_ENV" ]; then
    . "$SSH_ENV" > /dev/null
    fi
    ps -ef | grep "$SSH_AGENT_PID" | grep -v grep | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
        test_identities
    else
        start_agent
    fi
fi

某种方式,那个脚本根本没有被执行。我看不到应该被回显的任何字符串。我熟悉Linux和Mac OS X下的Unix命令行,但我不知道它在Windows下如何工作。请问有什么建议吗?

编辑:好吧,是我的错误...这个脚本被执行了,但我不完全理解它的作用。我希望能防止每次推送到远程库时都被要求输入密码。现在我仍然每次都被要求。


这个.bashrc完全只适用于UNIX系统。你在git bash中使用它的目的是什么? - favoretti
我在编辑完问题后,在问题末尾提到了我的推理。我该如何实现这一点?我对SSH的工作原理并不完全了解。 - codedog
3个回答

20

太好了!显然,在那个 .bashrc 中运行 ssh-agent 的方式有问题。我从这里复制了一个,它非常有效!现在当 git bash 启动时,我只需要输入一次我的密码,以后的推送就不再需要了。

以下是脚本的实际内容:

SSH_ENV=$HOME/.ssh/environment

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
     echo succeeded
     chmod 600 ${SSH_ENV}
     . ${SSH_ENV} > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

1
现在我已经让它工作了,我发现最好的命令行解决方案是:Powershell + Console2 + Posh-git! - codedog
+1 谢谢... GitHub的示例 对我也没用 :: 这个有效。 - Edward J Beckett
在我的情况下,我必须用双引号将所有 ${...} 包围起来(例如:"${SSH_ENV}" 等)。 - Olivier J.
我不得不将$HOME放在引号中,因为Windows用户名中有空格SSH_ENV="$HOME"/.ssh/environment - powtac

8
Windows上最简单的机制是从这里开始的http://anterence.blogspot.co.uk/2012/01/ssh-agent-in-msysgit.html 修改以显示除'id_rsa'之外的键名,.bashrc文件如下所示:
#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/github_rsa
ssh-add ~/.ssh/otherkey_rsa

你需要逐个输入每个密钥的密码,但仅在机器启动后的第一次使用时需要输入。

1
谢谢!这对我有用,其余的都没有。也很容易理解。 - Dermot
太好了。我唯一看到的小缺点是,你可能会在每个git bash窗口中有一个ssh-agent进程。 - Matthew Skelton

0

你可以试试这个,对我来说很有效。

SSH_ENV=$HOME/.ssh/environment

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
     echo succeeded
     chmod 600 ${SSH_ENV}
     . ${SSH_ENV} > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

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