При клонировании репозиториев git в автоматизированных инструментах - веб-интерфейсах, системах CI, иногда при вызове клонирования git открывается запрос с запросом имени пользователя и пароля (например, при клонировании несуществующего репозитория Github или на новом узле отсутствуют ключи ssh ).
Как мне заставить git просто выйти из строя (желательно с разумным сообщением об ошибке и кодом выхода) вместо того, чтобы ждать, пока серверный процесс предоставит ему имя пользователя и пароль?
В git версии 2.3 есть переменная среды GIT_TERMINAL_PROMPT
который при установке на 0
отключит запрос учетных данных.
Вы можете получить больше информации об этом в man git
(после обновления до версии git 2.3
) или в это сообщение в блоге на github.
Примеры:
git clone https://github.com/some/non-existing-repo
запросит имя пользователя и парольGIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo
завершится с ошибкой без запроса имени пользователя и пароляЕсли вы используете аутентификацию ssh и в Linux, вы можете создать замену команды ssh, чтобы отключить это.
Создайте файл с именем sshnoprompt.sh с помощью:
ssh -oBatchMode=yes $@
Сделайте этот файл исполняемым с помощью chmod +x sshnoprompt.sh
Затем при запуске git:
GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo
И он не разрешит никаких интерактивных подсказок или вопросов git - он не должен иметь возможность ни о чем просить пользователя.
Работает с git версии 1.8.3.1;
git clone -c core.askPass $echo url/or/path/to/git/repo
Конфигурация core.askPass
работает путем передачи управления обработкой учетных данных вышеупомянутой программе. Однако поскольку $echo
не может делать ничего, кроме вывода, попытка клонирования сразу завершается ошибкой и применяется соответствующее перенаправление bash. Этот код вызывается только в том случае, если репозиторий git оказывается частным, и выводит сообщение об ошибке, указывающее, что аутентификация не удалась для конкретного репозитория. Вы можете проверить это на https://github.com/git/git
публичный репозиторий против частного репозитория, о котором вы знаете.
Чтобы сделать сделку более приятной, вам даже не нужно будет ссылаться на такую программу, как echo
в первую очередь. Просто передайте конфигурацию git -c core.askPass
без последующего ввода все равно вызовет сбой в случае, если репозиторий окажется частным, поскольку код не будет знать, на какую программу передать обработку учетных данных. Хотя это, безусловно, более старый и простой метод, чем другие, упомянутые здесь, я не знаю, будет ли он иметь такой же эффект в старых версиях git.
Когда у вас есть контроль только над конфигурацией git:
git config --global credential.helper '!f() { echo quit=1; }; f'
Дает
$ git clone https://github.com/edx/drf-extensions.git/
Cloning into 'drf-extensions'...
fatal: credential helper '!f() { echo quit=1; }; f' told us to quit
В идея происходит от первоначального коммиттера GIT_TERMINAL_PROMPT
после перехода по ссылке @ user243345.
В зависимости от того, как вы запускаете git, перенаправление stdin или stdout, чтобы они не были подключены к терминалам, остановит git от запроса деталей и просто вызовет ошибку.
Это также позволит вам обнаруживать ошибки (или, по крайней мере, журналы) в веб-сервисе.