Назад | Перейти на главную страницу

git clone - сбой вместо запроса учетных данных

При клонировании репозиториев 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 от запроса деталей и просто вызовет ошибку.

Это также позволит вам обнаруживать ошибки (или, по крайней мере, журналы) в веб-сервисе.