git clone - kończy się niepowodzeniem zamiast pytania o poświadczenia

14

Podczas klonowania repozytoriów git w zautomatyzowanych narzędziach - interfejsach WWW, systemach CI, czasami wywołanie klonowania git powoduje wyświetlenie monitu o podanie nazwy użytkownika i hasła (na przykład podczas klonowania nieistniejącego repozytorium Github lub w nowym węźle brakuje kluczy ssh ).

Jak sprawić, by git po prostu nie działał (najlepiej z rozsądnym komunikatem o błędzie i kodem wyjścia) zamiast czekać na proces serwera, aby nadał mu nazwę użytkownika i hasło?

Tin Tvrtković
źródło
Mamy skonfigurowanego na wiele serwerów Jenkinsa, który irytująco siedzi i czeka na monit, dopóki nie zostanie zabity, jeśli będzie działał na nowym serwerze bez kluczy ssh - sposób na skonfigurowanie, że po prostu zawiedzie z komunikatem i niezerowym kodem wyjścia bądź pożyteczny.
Danny Staple,
Jeśli można również użyć trybu catch all „wsadowego”, aby uniemożliwić monitowanie o klucze hosta - byłoby to idealne rozwiązanie.
Danny Staple,
Są to zarówno związane - starając się poskładać je razem - serverfault.com/questions/61915/... , stackoverflow.com/questions/7772190/... .
Danny Staple,

Odpowiedzi:

15

W wersji git 2.3 dostępna jest zmienna środowiskowa, GIT_TERMINAL_PROMPTktóra po ustawieniu 0wyłącza monitowanie o poświadczenia.

Możesz uzyskać więcej informacji na ten temat w man git(po aktualizacji do wersji git 2.3) lub w tym blogu na github .

Przykłady:

  • git clone https://github.com/some/non-existing-repo poprosi o podanie nazwy użytkownika i hasła
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo zakończy się niepowodzeniem bez pytania o nazwę użytkownika i hasło

źródło
Frustrujące jest powrót tutaj z klonem git https na serwerze el7 z git 1.8. Sprawdzanie, czy aktualizacja do wersji 2.0 z drugiego repozytorium jest dla niego opcją.
Danny Staple
0

Jeśli używasz uwierzytelniania ssh i na Linuksie, możesz utworzyć zamianę polecenia ssh, aby to wyłączyć.

Utwórz plik o nazwie „sshnoprompt.sh” za pomocą:

ssh -oBatchMode=yes $@

Udostępnij ten plik za pomocą chmod +x sshnoprompt.sh

Następnie podczas uruchamiania git:

GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo

I nie pozwoli na interaktywne podpowiedzi lub pytania git - nie powinno być w stanie pytać użytkownika o nic.

Danny Staple
źródło
0

Działa z wersji git 1.8.3.1;

git clone -c core.askPass $echo url/or/path/to/git/repo

Konfiguracja core.askPassdziała poprzez przekazanie kontroli obsługi poświadczeń do wyżej wymienionego programu. Jednak ponieważ $echonie można nic zrobić poza wyjściem, próba klonowania natychmiast kończy się niepowodzeniem i stosuje się odpowiednie przekierowanie bash. Ten kod jest wywoływany tylko w przypadku, gdy repozytorium git jest prywatne i przesyła dane wyjściowe błędu, stwierdzając, że uwierzytelnienie nie powiodło się dla konkretnego repozytorium. Możesz to przetestować na https://github.com/git/gitrepozytorium publicznym przeciwko repozytorium prywatnemu, o którym wiesz.

Aby osłodzić umowę, nie musisz nawet odwoływać się do programu, tak jak echow pierwszej kolejności. Po prostu przekazanie konfiguracji git -c core.askPassbez podania danych wejściowych nadal spowodowałoby awarię w przypadku, gdy repozytorium jest prywatne, ponieważ kod nie będzie wiedział, do którego programu należy odciążyć obsługę poświadczeń. Chociaż jest to z pewnością starsza i prostsza metoda niż inne wymienione tutaj, nie wiem, czy będzie miała taki sam efekt w starszych wersjach git.

Jouster500
źródło
Jesteś trochę poprawny, a jednocześnie bardzo się mylisz. Po pierwsze, w twoim przypadku $echojest to zmienne odwołanie, które (będąc nieustawione) rozwija się do pustego łańcucha, więc jest całkowicie bez znaczenia. Jeśli wstawisz echotam (bez znaku dolara), byłoby to również niepoprawne, ponieważ byłoby interpretowane jako lokalizacja repozytorium. To musiało być -c core.askPass=echo.
Michał Górny
-1

W zależności od tego, w jaki sposób korzystasz z git, przekierowanie stdin lub stdout, aby nie były podłączone do terminali, przestanie pytać git o szczegóły i po prostu spowoduje błąd.

Pozwoliłoby to również na ujawnienie błędów (lub przynajmniej dzienników) w serwisie internetowym.

Matthew Steeples
źródło
Jak dokładnie miałbym to zrobić? Najpierw staram się to osiągnąć w Bash </dev/nulli nohup .. &wydaje się, że nie działają.
Tin Tvrtković
Ta odpowiedź nie jest pomocna bez konkretnego przykładu, jak to osiągnąć. Zwłaszcza, że ​​„oczywiste” metody nie działają, jak wspomniano powyżej.
Michał Górny
@ MichałGórny Nie widziałem pytania OP kilka lat temu, ale w pytaniu nie było wystarczającej ilości informacji (system operacyjny, zestaw narzędzi), aby móc na nie odpowiedzieć. Przekierowanie stdin i stdout. Git bardzo się zmienił, odkąd pytanie zostało zadane (na przykład w systemie Windows wyskakuje zewnętrzne okno dialogowe poświadczeń, jeśli łączysz się z Azure DevOps), więc lepiej jest użyć zmiennej środowiskowej wymienionej w górnej odpowiedzi
Matthew Steeples