Исправить местоположение 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 файл, так что не нужно делать тоже.

Другие вопросы по тегам