修复msysGit Portable $ HOME位置

时间:2010-08-11 01:57:00

标签: git ssh msysgit portable-applications home-directory

我已经在我的闪存驱动器上成功安装并配置了msysGit Portable,并使用它来拉动和推送GitHub repos。但是,我似乎总是需要克服SSH支持。

具体来说,为了让SSH找到我的密钥文件,每次运行git时,我都必须按these instructions启动ssh-agent的第二个实例然后ssh-add我的密钥 - bash.bat。

使用ssh -v git@github.com的输出进行调试我发现msysGit默认使用我的Windows用户目录来查找密钥。它不能那样做;我需要它在便携式驱动器上查看它自己的目录。

如何强制$ HOME成为程序自己的文件夹?

破坏Vox链接的更新

来自this page的说明与我最初发布的现已断开的链接类似。引用如下。这里也是webarchive of original Vox article

  

但是,如果你试试这个并获得:

% ssh-add
Could not open a connection to your authentication agent. 
     

然后您的会话未在ssh-agent下运行。您可以通过运行以下命令在代理程序下重新启动新shell来解决此问题:

exec ssh-agent bash 
     

您可以使用您选择的shell替换bash。执行此操作后,您应该能够运行ssh-add来加载该shell的密钥。

2 个答案:

答案 0 :(得分:17)

用于启动git bash的命令是:

C:\Windows\SysWOW64\cmd.exe /c ""C:\Prog\Git\1.7.1\bin\sh.exe" --login -i"

我刚刚在DOS会话中尝试了以下内容:

C:\>C:\Windows\SysWOW64\cmd.exe /c ""C:\Prog\Git\1.7.1\bin\sh.exe" --login -i"
VonC@XXX /c/
$ echo $HOME
/c/Users/VonC

默认情况下,$ HOME $%HOMEPATH%,但如果我强制%HOME%:

set HOME=/another/path

然后启动相同的bash会话:

C:\>C:\Windows\SysWOW64\cmd.exe /c ""C:\Prog\Git\1.7.1\bin\sh.exe" --login -i"
VonC@XXX /c/
$ echo $HOME
/another/path

因此,如果您通过将HOME设置为:

的脚本来包装bash调用
  • %~dp0:USB密钥包装器的路径
  • %~d1\your\path%~d1为驱动器号(如果您的包装器在其上,则为您的USB密钥)

,你应该能够强迫HOME获得你需要的任何价值。


注意(2011年11月):从那时起,OP dgw已经写了own wrapper

git-bash-portable.bat

@echo off
rem Copyright (C): 2010 Voyagerfan5761
rem http://technobabbl.es/

set USERPROFILE=%~dp0
set HOMEDRIVE=%~d0
set HOMEPATH=%~p0
set HOME=%~dp0
set HISTFILE=%USERPROFILE%.bash_history
rem set BASHRC=%USERPROFILE%.bashrc

git-bash.bat

文章“Portable Git for Windows: setting the $HOME environment variable to allow complete portability (including SSL keys and configuration for use with GitHub)”也添加了有用的信息。

  

但是,如果您在便携式驱动器上安装Git,您将希望您的设置随安装一起移动 - 显然,如果它在其他计算机上可能不存在的文件夹中查找它们,则显然不会。 / p>      

因此,我们需要做的是告诉Portable Git将其自己文件夹中的特定位置视为主文件夹;这样我们就可以将整个Git文件夹复制到我们喜欢的任何地方,并且设置随之随身携带。

答案 1 :(得分:1)

设置主目录

带有git-bash-portable.bat包装器的解决方案为我保留了另一个Windows CMD窗口,并保留在后台。

另一个更原生的解决方案是调整/etc/profile并在那里设置HOME var。只需将以下行添加到/etc/profile的末尾,myuser为您的虚拟用户名添加:

# end of /etc/profile
export HOME="/home/myuser"
cd

这会将正确的HOME目录和cds设置为它。然后启动机制,比如加载/etc/profile.d中的所有文件都能正常工作,只需双击即可启动git-bash.exe

当然,你必须创建你的主目录才能工作。启动git-bash并创建它:

mkdir -p /home/myuser

启动或重新连接到座席

关于代理,通常必须在打开的每个git-bash shell中重新加载。获取跨越所有git-bash窗口的独立代理的解决方案是在启动时包含以下小脚本~/.mgssh。它将代理env变量存储在agent.env目录中的文件.ssh中。任何新shell都会读取该文件,检查代理是否仍在运行并连接到该文件。如果它未运行,则启动代理并重写agent.env文件。确保您的.ssh目录存在。

# cat ~/.mgssh

agentfile=~/.ssh/agent.env

agent_load_env()
{
  test -f "$agentfile" && . "$agentfile" >| /dev/null;
}

agent_start()
{
  (umask 077; ssh-agent >| "$agentfile")
  . "$agentfile" >| /dev/null;
}

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
fi

# uncomment this, if you want to add a key on agent startup
#if [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
#    ssh-add
#fi

unset agentfile

现在来源.mgssh中的.bashrc脚本:

# cat .bashrc
. ~/.mgssh

# ... more .bashrc content

在GitHub上找到了这个:

https://help.github.com/articles/working-with-ssh-key-passphrases/#platform-windows

在去除棒之前杀死药剂

通常,在删除usbstick之前,要求Windows通过在资源管理器中右键单击或使用小系统图标来弹出操纵杆。如果您的代理仍处于运行状态,则无法使用此功能。确保在删除棒之前关闭最后一个shell之前杀死代理:

$ ssh-agent -k

unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 8472 killed;

备注:通常你也会使用eval $(ssh-agent -k)来取消设置env vars,但是在关闭shell之前这样做是不相关的。上述启动脚本.mgssh负责清理~/.ssh/agent.env文件,因此无需执行此操作。