修复 msysGit Portable $HOME 位置
Posted
技术标签:
【中文标题】修复 msysGit Portable $HOME 位置【英文标题】:Fix msysGit Portable $HOME location 【发布时间】:2011-03-28 03:42:35 【问题描述】:我已经在我的闪存驱动器上成功安装和配置了 msysGit Portable,并使用它来拉取和推送 GitHub 存储库。但是,我似乎总是不得不对 SSH 支持进行整合。
具体来说,为了让 SSH 找到我的密钥文件,我每次运行 git-bash.bat 时都必须按照 these instructions 来启动 ssh-agent
的第二个实例,然后是 ssh-add
我的密钥。
使用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
您可以将 bash 替换为您选择的 shell。完成此操作后,您应该能够运行 ssh-add 来加载该 shell 的密钥。
【问题讨论】:
作为解决此问题的一个副产品,我希望最终分散在我使用的任何 PC 的用户目录中的所有其他文件也能正确定位。 .bash_history、.gitk 等应该和我一起旅行,不要在我每次切换机器时都落伍。 ***.com/a/19136789/1233435 有一些关于Could not open a connection to your authentication agent.
错误的有用细节
【参考方案1】:
用于启动 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 安装在便携式驱动器上,您会希望您的设置随安装一起移动 - 如果它在其他计算机上可能不存在的文件夹中查找它们,显然他们不会这样做。
所以,我们需要做的是告诉 Portable Git 将其自己文件夹中的特定位置视为主文件夹;这样我们就可以将整个 Git 文件夹复制到我们喜欢的任何地方,并且设置会随之移动。
【讨论】:
非常感谢。我会尽快尝试(现在在路上,但我会有时间),一旦我确认它会起作用,我会接受你的回答。 (我现在会接受,但在验证其正确性之前接受答案似乎很奇怪。) @Voyager: 没问题,慢慢来 ;) 在很长(很长)时间之后,我已经接受了答案 :) 请参阅 meta.stackexchange.com/questions/36318/… 的 cmets 很棒的线程。 :) 我刚刚测试了我的包装,它完全像一个魅力。剩下的唯一细节是我是否可以在没有尾部斜杠的情况下获得%~dp0
的值;有任何想法吗?如果没有,那很好;我的设置仍然运行良好。
@Voyager:如果您在 USB 中使用固定路径(始终相同),您应该只使用 %d1
并按照您认为合适的方式构建路径。如果没有,您需要使用基于 DOS 的字符替换来删除最后一个字符。见dostips.com/DtTipsStringManipulation.php。 set str=%str:-1%
应该这样做。
知道为什么这不是便携式安装程序的默认行为吗?弄清楚这一点非常令人沮丧,我很确定我会把它搞砸并要求我的用户在他使用的每台计算机上都必须搞砸这个(即,他不会使用它,因为这种行为)。【参考方案2】:
设置主目录
带有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
。它将代理环境变量存储在.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 上找到这个:
https://help.github.com/articles/working-with-ssh-key-passphrases/#platform-windows
在移除棍子之前杀死代理
通常,在您移除 USB 记忆棒之前,您要求 Windows 弹出记忆棒,方法是在资源管理器中右键单击它或使用小系统托盘图标。如果您的代理仍在运行,这将不起作用。确保在移除棍子时关闭最后一个 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
文件,因此也不必这样做。
【讨论】:
有趣的方法。 +1 感谢您的 +1。我将 $USERNAME 更正为与主目录中的用户目录匹配的硬编码用户 - 不同的 Windows 机器可能有不同的用户,因此 $USERNAME 不起作用。我还添加了在移除棍子之前杀死代理的说明。以上是关于修复 msysGit Portable $HOME 位置的主要内容,如果未能解决你的问题,请参考以下文章
适用于 Windows 的 Git-scm、msysGit 和 Git 之间的区别
尝试使用 git filter-branch 修复行尾,但没有运气