Ao clonar repositórios git em ferramentas automatizadas - front-ends da web, sistemas de CI, às vezes a chamada de clone git abre um prompt solicitando o nome de usuário e a senha (por exemplo, ao clonar um repositório inexistente do Github ou em um novo nó sem chaves ssh )
Como faço para que o git simplesmente falhe (de preferência com uma mensagem de erro sensata e um código de saída) em vez de esperar pelo processo do servidor fornecer um nome de usuário e senha?
git
automation
Tin Tvrtković
fonte
fonte
Respostas:
Na versão 2.3 do git, há uma variável de ambiente
GIT_TERMINAL_PROMPT
que, quando definida como0
, desabilitará a solicitação de credenciais.Você pode obter mais informações sobre isso
man git
(após atualizar para a versão git2.3
) ou nesta postagem do blog no github .Exemplos:
git clone https://github.com/some/non-existing-repo
solicitará nome de usuário e senhaGIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo
falhará sem solicitar nome de usuário e senhafonte
Se você estiver usando autenticação ssh e no linux, poderá criar uma substituição de comando ssh para desativar isso.
Crie um arquivo chamado "sshnoprompt.sh" com:
ssh -oBatchMode=yes $@
Torne este arquivo executável com
chmod +x sshnoprompt.sh
Então, ao iniciar o git:
GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo
E isso não permitirá nenhuma solicitação ou pergunta interativa do Git - não deve ser possível pedir nada ao usuário.
fonte
Trabalhando a partir da versão 1.8.3.1 do git;
git clone -c core.askPass $echo url/or/path/to/git/repo
A configuração
core.askPass
funciona passando o controle de manipulação de credenciais para o programa mencionado acima. No entanto, como$echo
não é possível fazer nada, exceto a saída, a tentativa de clone falha imediatamente e o redirecionamento do bash é aplicável. Esse código é invocado apenas no caso de o repositório git ser privado e canalizará a saída de erro informando que a autenticação falhou para o repositório específico. Você pode testar isso nohttps://github.com/git/git
repositório público em um repositório privado que você conhece.Para adoçar o negócio, você nem precisaria fazer referência a um programa como
echo
em primeiro lugar. Simplesmente passar a configuração do git-c core.askPass
sem nenhuma entrada a seguir ainda causaria falha no caso de o repositório ser privado, pois o código não saberá para qual programa transferir a manipulação de credenciais. Embora este seja certamente um método mais antigo e mais simples do que os outros mencionados aqui, não sei se ele terá o mesmo efeito nas versões mais antigas do git.fonte
$echo
há uma referência variável que (não configurada) se expande para uma string vazia, por isso é totalmente sem sentido. Se você colocarecho
lá (sem o sinal de cifrão), também estará incorreto, pois será interpretado como local do repositório. Teria que ser-c core.askPass=echo
.Dependendo de como você estiver executando o git, o redirecionamento stdin ou stdout para que eles não estejam conectados aos terminais impedirá que o git solicite detalhes e apenas cometa erros.
Isso também permitiria que você aparecesse erros (ou pelo menos logs) no serviço da web.
fonte
</dev/null
enohup .. &
não parece trabalho.