我已经在我的闪存驱动器上成功安装并配置了msysGit Portable,并使用它来拉动和推送GitHub repos。但是,我似乎总是需要克服SSH支持。
具体来说,为了让SSH找到我的密钥文件,每次运行git时,我都必须按these instructions启动ssh-agent
的第二个实例然后ssh-add
我的密钥 - bash.bat。
使用ssh -v git@github.com
的输出进行调试我发现msysGit默认使用我的Windows用户目录来查找密钥。它不能那样做;我需要它在便携式驱动器上查看它自己的目录。
如何强制$ HOME成为程序自己的文件夹?
来自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的密钥。
答案 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
但是,如果您在便携式驱动器上安装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
文件,因此无需执行此操作。