修复msysGit便携$HOME位置
我已经成功地在我的闪存驱动器上安装和配置了msysGit Portable,并使用它来拉入和推送GitHub repos。然而,我似乎总是对SSH支持感到困惑 具体来说,为了让SSH找到我的密钥文件,我必须在每次运行git-bash.bat时启动修复msysGit便携$HOME位置,git,ssh,msysgit,portable-applications,home-directory,Git,Ssh,Msysgit,Portable Applications,Home Directory,我已经成功地在我的闪存驱动器上安装和配置了msysGit Portable,并使用它来拉入和推送GitHub repos。然而,我似乎总是对SSH支持感到困惑 具体来说,为了让SSH找到我的密钥文件,我必须在每次运行git-bash.bat时启动SSH代理的第二个实例,然后SSH addmy key 使用ssh-v的输出git@github.com要进行调试,我看到msysGit默认使用我的Windows用户目录来查找密钥。它不能那样做;我需要它在便携式驱动器上查找自己的目录 如何强制$HOME
SSH代理的第二个实例,然后SSH add
my key
使用ssh-v的输出git@github.com
要进行调试,我看到msysGit默认使用我的Windows用户目录来查找密钥。它不能那样做;我需要它在便携式驱动器上查找自己的目录
如何强制$HOME成为程序自己的文件夹
更新已断开的Vox链接
来自的说明类似于我最初发布的现在已断开的链接。引述如下。还有,这是我的建议
但是,如果您尝试此操作并获得:
% ssh-add
Could not open a connection to your authentication agent.
那么您的会话没有在ssh代理下运行。您可以通过运行以下命令在代理下重新启动新的shell来解决此问题:
exec ssh-agent bash
在这里,您可以用自己选择的shell替换bash。完成此操作后,您应该能够运行ssh add来加载该shell的密钥
用于启动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
:U盘包装的路径
- 或者
%~d1\your\path
:其中%~d1
为驱动器号(如果包装器在U盘上,则为U盘的驱动器号)
,您应该能够强制实现所需的任何价值
注(2011年11月):自那时起,委员会已将其:
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安装在便携式驱动器上,您会希望设置随安装一起移动,而如果安装在其他计算机上可能不存在的文件夹中查找设置,则设置显然不会随安装一起移动
因此,我们需要做的是告诉PortableGit将自己文件夹中的特定位置作为主文件夹;这样我们就可以将整个Git文件夹复制到任何我们喜欢的地方,设置也会随之移动
设置主目录
带有gitbash-portable.bat
wrapper的解决方案为我打开了另一个留在后台的Windows CMD窗口
另一个更自然的解决方案是调整/etc/profile
,并在那里设置主变量。只需在虚拟用户名的/etc/profile
,myuser
末尾添加以下行:
# end of /etc/profile
export HOME="/home/myuser"
cd
这将设置正确的主目录和CD。然后启动机制,比如从/etc/profile.d
加载所有文件,可以正常工作,只需双击启动git bash.exe
当然,您必须创建您的主目录才能使其工作。启动git bash并创建它:
mkdir -p /home/myuser
正在启动或重新连接到代理
关于代理,通常必须在每次打开git bash shell时重新加载它。获得跨越所有git bash窗口的独立代理的解决方案是在启动中包含以下小脚本~/.mgssh
。它将代理环境变量存储在.ssh
目录下的文件agent.env
中。任何新的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
现在,在.bashrc
中找到.mgssh
脚本的源代码:
# cat .bashrc
. ~/.mgssh
# ... more .bashrc content
在GitHub上找到此文件:
在拔棒前杀死药剂
通常,在移除USB棒之前,请Windows在资源管理器中右键单击棒或使用小的systray图标来弹出棒。如果代理仍在运行,则此操作将不起作用。在移除棍棒后关闭最后一个外壳之前,确保杀死该药剂:
$ 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
文件,因此也不必这样做。作为解决此问题的一个副产品,我希望最终分散在我使用的任何PC的用户目录中的所有其他文件也能正确定位。bash_history、.gitk等应该和我一起旅行,而不是每次我换机器都被甩在后面。有一些有用的详细信息,无法打开与您的身份验证代理的连接。
错误非常感谢。我会尽快尝试(现在在路上,但总有一天我会有时间),一旦我确认它有效,我会接受你的答案。(我现在愿意接受,但在验证答案的正确性之前接受答案似乎有些奇怪。)@Voyager:没问题,慢慢来;)很久(很久)以前,我的答案已经被接受了:)请看Great thread的评论。:)我刚刚测试了我的包装纸,它完全像一个符咒。剩下的唯一细节是我是否可以在没有后面斜杠的情况下获得%~dp0
的值;有什么想法吗?如果没有,那没关系;我的设置仍然很好。@Voyager:如果您在USB中使用固定路径(始终相同),则只需使用%d1
,并根据需要构建路径。如果没有,则需要使用基于DOS的字符替换删除最后一个字符。看<代码>设置str=%str:-1%
应该这样做。你知道为什么这不是便携式安装程序的默认行为吗?弄明白这一点是非常令人沮丧的,我很确定我会把它搞砸,并要求我的用户在他使用的每台计算机上都把它搞砸(也就是说,由于这个原因,他不会使用它)