git clone - ошибка вместо запроса учетных данных
При клонировании git-репозиториев в автоматизированных инструментах - веб-интерфейсах, системах CI, иногда при вызове git-клона открывается запрос на ввод имени пользователя и пароля (например, при клонировании несуществующего репозитория Github или на новом узле, где отсутствуют ssh-ключи).).
Как заставить git просто потерпеть неудачу (желательно с разумным сообщением об ошибке и кодом выхода), вместо того, чтобы ждать, пока процесс сервера выдаст ему имя пользователя и пароль?
7 ответов
В 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
потерпит неудачу без запроса имени пользователя и пароля
Как пропустить, игнорировать и/или отклонить запросы учетных данных git
Приведенные выше ответы сработали для меня только частично при использовании Git-for-Windows: два разных приложения соперничали за мое внимание с помощью автоматизированных сценариев git pull/push:
- git-credentials-manager (разработан командой GfW AFAICT; имеет чистый серый интерфейс Windows)
- еще один диалог, в родословной которого определенно (дрянно выглядящие) гены X-Windows.
Чтобы закрыть их все , не удаляя диспетчер учетных данных, как указано в некоторых ответах здесь: https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windows, здесь что сейчас работает, сидя поверх автоматизированного(bash
) сценарии оболочки:
# https://serverfault.com/questions/544156/git-clone-fail-instead-of-prompting-for-credentials
export GIT_TERMINAL_PROMPT=0
# next env var doesn't help...
export GIT_SSH_COMMAND='ssh -oBatchMode=yes'
# these should shut up git asking, but only partly: the X-windows-like dialog doesn't pop up no more, but ...
export GIT_ASKPASS=echo
export SSH_ASKPASS=echo
# We needed to find *THIS* to shut up the bloody git-for-windows credential manager:
# https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windows#answer-45513654
export GCM_INTERACTIVE=never
Что НЕ сработало
- Все заклинания
git config credential.modalprompt false
- упоминается как решение в ответах на связанный вопрос SO. для меня нет кубиков . - возиться с этим
GIT_SSH_COMMAND
Переменная среды: ничего не помогло, кроме сохранения ее, поскольку я подозреваю, что она сработает при запуске этого материала в Linux вместо Windows. -
GIT_TERMINAL_PROMPT=0
: тоже не работаю . Оставил его по той же причине, но в Windows ничего не получилось .
Да, и удаление менеджера учетных данных git, как было предложено в других ответах в этой ссылке SO, было решено как неприемлемый вариант, поскольку это определенно повлияет на другие деревья репозитория, где эта вещь однажды может пригодиться. Хотя это некоторое время рассматривалось, прежде чем я решил не делать этого.
Что сработало
- возиться с этими двумя
*_ASKPASS
env.vars., как ни странно, закройте приглашение для входа в систему, похожее на X-Windows (автоматически)git push
. Ура! -
GCM_INTERACTIVE=never
был волшебным ингредиентом, который наконец-то закрыл диалог диспетчера учетных данных git for Windows. Благодаря этому конкретному ответу (https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windows#answer-45513654), который находится не в верхней части список, но определенно был самым важным для моего случая.
Моя версия git
$ git --version
git version 2.30.1.windows.1
Прощальное письмо
<rant>
Я искал эту информацию время от времени в течение многих лет: на этот раз, видимо, мне повезло, и, возможно, я продержался дольше (?), пробираясь через миллионы страниц, ворча о настройке ваших учетных данных: Google явно не умен. По крайней мере, он не очень хорошо прислушивается к вопросам меньшинства, это точно.</rant>
Заголовок добавляется в надежде, что индексация Google поместит эту страницу выше для следующей, ищущей ответы на эти вопросы или их варианты...
Если вы используете аутентификацию 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_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo
Работайте у меня на Mac.
Работа с 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 от запроса подробностей и просто вызовет ошибку.
Это также позволит вам обнаружить ошибки (или, по крайней мере, журналы) для веб-службы.