20

我已经在我的闪存驱动器上成功安装和配置了 msysGit Portable,并使用它来拉取和推送 GitHub 存储库。但是,我似乎总是不得不对 SSH 支持进行整合。

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

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

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

更新损坏的 Vox 链接

此页面的说明类似于我最初发布的现已损坏的链接。引用如下。另外这里是原始 Vox 文章的网络存档。

但是,如果您尝试这样做并获得:

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

那么你的会话没有在 ssh-agent 下运行。您可以通过运行以下命令重新启动代理下的新 shell 来解决此问题:

exec ssh-agent bash 

您可以在其中将 bash 替换为您选择的 shell。完成此操作后,您应该能够运行 ssh-add 来加载该 shell 的密钥。

4

2 回答 2

18

用于启动 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编写了自己的包装器

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:设置$HOME环境变量以允许完全可移植性(包括 SSL 密钥和与 GitHub 一起使用的配置) ”也添加了有用的信息。

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

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

于 2010-08-11T04:13:35.300 回答
1

设置主目录

带有git-bash-portable.bat包装器的解决方案会为我打开另一个位于后台的 Windows CMD 窗口。

另一个更原生的解决方案是在那里调整/etc/profile和设置 HOME 变量。只需将以下行添加到您的虚拟/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在启动中包含以下小脚本。它将代理环境变量存储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

在移除棒之前杀死代理

通常,在您移除 U 盘之前,您会要求 Windows弹出U 盘,方法是在资源管理器中右键单击它或使用小系统托盘图标。如果您的代理仍在运行,这将不起作用。确保在移除棍子时关闭最后一个 shell 之前杀死代理:

$ ssh-agent -k

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

备注:通常你也可以eval $(ssh-agent -k)用来取消设置环境变量,但是当你在关闭 shell 之前这样做时,它是无关紧要的。上面的启动脚本.mgssh负责清理~/.ssh/agent.env文件,因此也不必这样做。

于 2018-04-10T07:16:36.683 回答