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?


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

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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.