修复msysGit便携$HOME位置

修复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

我已经成功地在我的闪存驱动器上安装和配置了msysGit Portable,并使用它来拉入和推送GitHub repos。然而,我似乎总是对SSH支持感到困惑

具体来说,为了让SSH找到我的密钥文件,我必须在每次运行git-bash.bat时启动
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%
应该这样做。你知道为什么这不是便携式安装程序的默认行为吗?弄明白这一点是非常令人沮丧的,我很确定我会把它搞砸,并要求我的用户在他使用的每台计算机上都把它搞砸(也就是说,由于这个原因,他不会使用它)