Исправить местоположение msysGit Portable $HOME
Я успешно установил и настроил msysGit Portable на мою флешку и использовал ее для извлечения и установки репозиториев GitHub. Тем не менее, я, кажется, всегда должен поддерживать SSH.
В частности, чтобы SSH мог найти мои ключевые файлы, я должен следовать этим инструкциям, чтобы запустить второй экземпляр ssh-agent
а потом ssh-add
мой ключ каждый раз, когда я запускаю git-bash.bat.
Используя вывод ssh -v git@github.com
для отладки я вижу, что msysGit по умолчанию использует мой каталог пользователя Windows для поиска ключей. Это не может сделать это; Мне нужно, чтобы он посмотрел в своем собственном каталоге на переносном диске.
Как я могу заставить $HOME быть собственной папкой программы?
Обновление для неработающей ссылки Vox
Инструкции с этой страницы похожи на сломанную ссылку, которую я первоначально разместил. Цитируется ниже. Также вот веб-архив оригинальной статьи Vox.
Однако, если вы попробуете это и получите:
% ssh-add Could not open a connection to your authentication agent.
тогда ваш сеанс не работает под ssh-agent. Вы можете обойти это, перезапустив новую оболочку под агентом, выполнив:
exec ssh-agent bash
где вы можете заменить bash на оболочку по вашему выбору. Как только вы это сделаете, вы сможете запустить ssh-add, чтобы загрузить ключ для этой оболочки.
2 ответа
Команда, используемая для запуска 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
Так что если вы оберните вызов bash скриптом, установив HOME в:
%~dp0
: путь оболочки на вашем USB-ключе- или же
%~d1\your\path
: с%~d1
буква диска (вашего USB-ключа, если на нем есть обертка)
, вы должны быть в состоянии заставить HOME к любой ценности, в которой вы нуждаетесь.
Примечание (ноябрь 2011): с тех пор 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
Статья " Переносимый Git для Windows: настройка $HOME
переменная окружения, обеспечивающая полную переносимость (включая ключи SSL и конфигурацию для использования с GitHub) ", также добавляет полезную информацию.
Однако, если вы установите Git на переносной диск, вы захотите, чтобы ваши настройки перемещались вместе с установкой, чего, очевидно, не будет, если он ищет их в папке, которая может отсутствовать на других компьютерах.
Итак, нам нужно сказать, чтобы Portable Git рассматривал определенное место в своей собственной папке как домашнюю папку; Таким образом, мы можем скопировать всю папку Git куда угодно, и настройки будут соответствовать ей.
Установка дома реж
Решение с git-bash-portable.bat
Оболочка открывает другое окно Windows CMD для меня, которое остается в фоновом режиме.
Другое, более нативное решение - настроить /etc/profile
и установите там HOME var. Просто добавьте следующие строки в конец /etc/profile
, myuser
быть вашим виртуальным именем пользователя:
# end of /etc/profile
export HOME="/home/myuser"
cd
Это устанавливает правильный каталог HOME и компакт-диски в него. Затем механизм запуска, как загрузка всех файлов из /etc/profile.d
работает правильно и вы только начинаете git-bash.exe
с двойным щелчком.
Конечно, вы должны создать свой домашний каталог, чтобы это работало. Запустите git-bash и создайте его:
mkdir -p /home/myuser
Запуск или переподключение к агенту
Что касается агента, он обычно должен быть перезагружен с каждой открытой оболочкой git-bash. Решение получить независимого агента, охватывающего все окна git-bash, состоит в том, чтобы включить следующий небольшой скрипт ~/.mgssh
в стартапе. Хранит агент env vars в файле agent.env
в .ssh
каталог. Любая новая оболочка читает файл, проверяет, все ли еще работает агент, и подключается к нему. Если он не запущен, он запускает агент и перезаписывает agent.env
файл. Убедитесь, что ваш .ssh
DIR существует.
# 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/
Убить агента перед удалением палки
Обычно перед удалением usbstick вы просите Windows извлечь его, щелкнув правой кнопкой мыши в проводнике или используя маленький значок systray. Это не будет работать, если ваш агент все еще работает. Обязательно убейте агента перед закрытием последней оболочки при удалении флешки:
$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 8472 killed;
Замечание: обычно вы бы использовали eval $(ssh-agent -k)
сбрасывать также env vars, но когда вы делаете это непосредственно перед закрытием оболочки, это не имеет значения. Приведенный выше скрипт запуска .mgssh
заботится о уборке ~/.ssh/agent.env
файл, так что не нужно делать тоже.