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?
git
automation
Tin Tvrtković
źródło
źródło
Odpowiedzi:
W wersji git 2.3 dostępna jest zmienna środowiskowa,
GIT_TERMINAL_PROMPT
która po ustawieniu0
wyłącza monitowanie o poświadczenia.Możesz uzyskać więcej informacji na ten temat w
man git
(po aktualizacji do wersji git2.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łaGIT_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
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.
źródło
Działa z wersji git 1.8.3.1;
git clone -c core.askPass $echo url/or/path/to/git/repo
Konfiguracja
core.askPass
działa poprzez przekazanie kontroli obsługi poświadczeń do wyżej wymienionego programu. Jednak ponieważ$echo
nie 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ć nahttps://github.com/git/git
repozytorium publicznym przeciwko repozytorium prywatnemu, o którym wiesz.Aby osłodzić umowę, nie musisz nawet odwoływać się do programu, tak jak
echo
w pierwszej kolejności. Po prostu przekazanie konfiguracji git-c core.askPass
bez 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.źródło
$echo
jest 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 wstawiszecho
tam (bez znaku dolara), byłoby to również niepoprawne, ponieważ byłoby interpretowane jako lokalizacja repozytorium. To musiało być-c core.askPass=echo
.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.
źródło
</dev/null
inohup .. &
wydaje się, że nie działają.