Corrigir localização msysGit Portable $ HOME

Instalei e configurei com sucesso o msysGit Portable no meu pendrive e usei-o para puxar e empurrar os repositorys do GitHub. No entanto, parece que eu sempre tenho que chocar o suporte SSH.

Especificamente, para que o SSH encontre meus arquivos de chave, eu tenho que seguir estas instruções para iniciar uma segunda instância do ssh-agent e então ssh-add minha chave toda vez que eu executar o git-bash.bat.

Usando a saída de ssh -v git@github.com para depurar, vejo que o msysGit usa como padrão meu diretório de usuários do Windows para procurar chaves. Não pode fazer isso; Eu preciso olhar em seu próprio diretório na unidade portátil.

Como posso forçar o $ HOME a ser a pasta do programa?

Atualização para o vox quebrado do Vox

As instruções desta página são semelhantes ao link agora quebrado que eu postei originalmente. Citado abaixo. Também aqui está o webarchive do artigo Vox original .

No entanto, se você tentar isso e obter:

 % ssh-add Could not open a connection to your authentication agent. 

então sua session não está sendo executada sob o agente ssh. Você pode contornar isso reiniciando um novo shell sob o agente executando:

 exec ssh-agent bash 

onde você pode replace bash com o shell de sua escolha. Depois de fazer isso, você poderá executar ssh-add para carregar sua chave para esse shell.

O comando usado para iniciar o git bash é:

 C:\Windows\SysWOW64\cmd.exe /c ""C:\Prog\Git\1.7.1\bin\sh.exe" --login -i" 

Eu tentei o seguinte em uma session do 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 

Por padrão, $ HOME $% HOMEPATH%, mas se eu forçar% HOME%:

 set HOME=/another/path 

e, em seguida, inicie a mesma session 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 

Então, se você envolver a chamada de bash por um script, configure o HOME para:

  • %~dp0 : o caminho do wrapper na sua chave USB
  • ou %~d1\your\path : com %~d1 sendo a letra da unidade (da sua chave usb se o seu wrapper estiver nela)

, você deve ser capaz de forçar o HOME a qualquer valor que você precise.


Nota (novembro de 2011): desde então, o OP dgw escreveu seu próprio 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 

O artigo ” Portable Git for Windows: definindo a variável de ambiente $HOME para permitir a portabilidade completa (incluindo chaves SSL e configuração para uso com o GitHub) ” também adiciona informações úteis.

No entanto, se você instalar o Git em uma unidade portátil, desejará que suas configurações sejam executadas na instalação, o que obviamente não acontecerá se estiver procurando por elas em uma pasta que talvez não exista em outros computadores.

Então, o que precisamos fazer é dizer ao Portable Git para tratar um local específico dentro de sua própria pasta como a pasta inicial; Dessa forma, podemos copiar toda a pasta Git em qualquer lugar que quisermos e as configurações vão viajar com ela.

Configurando o diretório inicial

A solução com um wrapper git-bash-portable.bat abre outra janela do Windows CMD para mim que fica em segundo plano.

Outra solução, mais nativa, é ajustar o /etc/profile e definir o HOME var lá. Basta adicionar as seguintes linhas ao final de /etc/profile , myuser sendo seu nome de usuário virtual :

 # end of /etc/profile export HOME="/home/myuser" cd 

Isso define o diretório HOME apropriado e cds nele. Então o mecanismo de boot, como carregar todos os arquivos do /etc/profile.d funciona corretamente e você acabou de iniciar o git-bash.exe com um duplo clique.

Claro que você tem que criar o seu diretório home para que isso funcione. Inicie o git-bash e crie-o:

 mkdir -p /home/myuser 

Iniciando ou reconectando-se ao agente

Em relação ao agente, ele geralmente precisa ser recarregado com todos os shell git-bash abertos. Uma solução para obter um agente independente abrangendo todas as janelas do git-bash é include o seguinte pequeno script ~/.mgssh na boot. Ele armazena o agente env vars em um arquivo agent.env no diretório .ssh . Qualquer novo shell lê o arquivo, verifica se o agente ainda está em execução e se conecta a ele. Se não estiver em execução, ele inicia o agente e reescreve o arquivo agent.env . Verifique se o seu diretório .ssh existe.

 # 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 

Agora, .mgssh script .mgssh em seu .bashrc :

 # cat .bashrc . ~/.mgssh # ... more .bashrc content 

Encontrei isto no GitHub:

https://help.github.com/articles/working-with-ssh-key-passphrases/#platform-windows

Matando o agente antes da remoção do palito

Normalmente, antes de remover seu usbstick, peça ao Windows para ejetar o gravador, clicando com o botão direito do mouse no explorador ou usando o ícone systray. Isso não funcionará se seu agente ainda estiver funcionando. Certifique-se de matar o agente antes de fechar o último shell após a remoção do stick:

 $ ssh-agent -k unset SSH_AUTH_SOCK; unset SSH_AGENT_PID; echo Agent pid 8472 killed; 

Observação: Normalmente você usaria o eval $(ssh-agent -k) para remover o env vars também, mas como você faz isso antes de fechar o shell é irrelevante. O script de boot acima .mgssh cuida da limpeza do ~/.ssh/agent.env para que isso também não precise ser feito.