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, было решено как неприемлемый вариант, поскольку это определенно повлияет на другие деревья репозитория, где эта вещь однажды может пригодиться. Хотя это некоторое время рассматривалось, прежде чем я решил не делать этого.

Что сработало

  • возиться с этими двумя*_ASKPASSenv.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 от запроса подробностей и просто вызовет ошибку.

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

Другие вопросы по тегам