git clone - falha ao invés de solicitar credenciais

13

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?

Tin Tvrtković
fonte
Temos uma Jenkins configurada para vários servidores, que fica irritantemente aguardando um prompt até ser interrompida, se for executada em um novo servidor sem as chaves ssh - uma maneira de configurar que simplesmente falhará com uma mensagem e o código de saída diferente de zero seria seja útil.
Danny Staple
Se um modo catch all "batch" puder ser usado para impedir a solicitação de chaves do host - isso seria o ideal.
Danny Staple
Ambos estão relacionados - tentando reuni-los - serverfault.com/questions/61915/… , stackoverflow.com/questions/7772190/… .
Danny Staple

Respostas:

14

Na versão 2.3 do git, há uma variável de ambiente GIT_TERMINAL_PROMPTque, quando definida como 0, desabilitará a solicitação de credenciais.

Você pode obter mais informações sobre isso man git(após atualizar para a versão git 2.3) ou nesta postagem do blog no github .

Exemplos:

  • git clone https://github.com/some/non-existing-repo solicitará nome de usuário e senha
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo falhará sem solicitar nome de usuário e senha

fonte
Frustrante estar de volta aqui com um clone https git, em um servidor el7 com git 1.8. Ir para verificar se a atualização para 2.0 a partir do outro repositório é uma opção para isso.
Danny Staple
0

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.

Danny Staple
fonte
0

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.askPassfunciona passando o controle de manipulação de credenciais para o programa mencionado acima. No entanto, como $echonã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 no https://github.com/git/gitrepositó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 echoem primeiro lugar. Simplesmente passar a configuração do git -c core.askPasssem 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.

Jouster500
fonte
Você está um pouco correto enquanto está muito errado. Primeiro de tudo, no seu caso, $echohá uma referência variável que (não configurada) se expande para uma string vazia, por isso é totalmente sem sentido. Se você colocar echolá (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.
Michał Górny
-1

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.

Matthew Steeples
fonte
Como exatamente eu faria isso? Tentando fazer isso em Bash primeiro, ambos </dev/nulle nohup .. &não parece trabalho.
Tin Tvrtković
Esta resposta não é útil sem um exemplo específico de como conseguir isso. Especialmente que os métodos "óbvios" não funcionam, como mencionado acima.
Michał Górny
@ MichałGórny Eu não tinha visto a pergunta dos OP há alguns anos, mas não havia informações suficientes na pergunta (SO, conjunto de ferramentas) para poder responder a isso. Redirecionando stdin e stdout. O Git mudou muito desde que a pergunta foi feita (no Windows, por exemplo, ele exibe diálogos externos para credenciais se você estiver se conectando ao Azure DevOps), para que seja melhor usar a variável de ambiente listada na resposta principal
Matthew Steeples