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

14

При клонировании git-репозиториев в автоматизированных инструментах - веб-интерфейсах, системах CI, иногда при вызове git-клона открывается запрос на ввод имени пользователя и пароля (например, при клонировании несуществующего репозитория Github или на новом узле, где отсутствуют ssh-ключи). ).

Как заставить git просто потерпеть неудачу (желательно с разумным сообщением об ошибке и кодом выхода), вместо того, чтобы ждать, пока процесс сервера выдаст ему имя пользователя и пароль?

Тин Тврткович
источник
У нас настроен мультисервер Jenkins, который досадно сидит в ожидании приглашения, пока не будет уничтожен, если он запускается на новом сервере без ключей ssh ​​- способ настроить, что он просто потерпит неудачу с сообщением, и ненулевой код выхода будет быть полезным.
Дэнни Стейпл
Если бы можно было использовать режим «перехватить все» в пакетном режиме, чтобы запретить также запрашивать ключи хоста - это было бы идеально.
Дэнни Стейпл
Они оба связаны - пытаясь соединить их вместе - serverfault.com/questions/61915/… , stackoverflow.com/questions/7772190/… .
Дэнни Стейпл

Ответы:

15

В 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 потерпит неудачу без запроса имени пользователя и пароля

источник
Разочаровывает возвращение сюда с клона https git на сервере el7 с git 1.8. Собирается проверить, является ли обновление до 2.0 из другого репозитория вариантом для этого.
Дэнни Стейпл
0

Если вы используете аутентификацию 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 - он не должен быть в состоянии спросить пользователя о чем-либо.

Дэнни Стейпл
источник
0

Работа с 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.

Jouster500
источник
Вы несколько правы, хотя и очень неправы. Прежде всего, в вашем случае $echoэто ссылка на переменную, которая (будучи неустановленной) расширяется до пустой строки, поэтому она совершенно бессмысленна. Если вы вставите echoтуда (без знака доллара), это также будет неверно, так как это будет интерпретировано как местоположение хранилища. Это должно быть -c core.askPass=echo.
Михал Гурны
-1

В зависимости от того, как вы используете git, перенаправление stdin или stdout, чтобы они не были подключены к терминалам, остановит git от запроса подробностей и просто вызовет ошибку.

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

Мэтью Стиплз
источник
Как именно я буду делать это? Попытка выполнить это в Bash сначала, и то </dev/nullи другое nohup .. &, похоже, не работает.
Тин Тврткович
Этот ответ бесполезен без конкретного примера, как этого добиться. Тем более что «очевидные» методы не работают, как упоминалось выше.
Михал Гурны
@ MichałGórny Несколько лет назад я не видел вопроса об ОП, но в этом вопросе не было достаточно информации (ОС, Toolset), чтобы ответить на него. Перенаправление stdin и stdout. Git сильно изменился с тех пор, как был задан вопрос (например, в Windows он выдает внешние диалоговые окна для ввода учетных данных, если вы подключаетесь к DevOps Azure), поэтому вам лучше использовать переменную среды, указанную в верхнем ответе
Matthew Steeples