#git
#git
Вопрос:
Я работаю над приложением, в котором пользователь может войти в репозиторий Git, который затем клонируется на локальный компьютер. В некоторых случаях (например, неправильно введенный URL-адрес, указывающий на несуществующий репозиторий на Github), клиент Git запросит у пользователя имя пользователя и пароль. Я не хочу такого поведения — я просто хочу, чтобы Git завершался сбоем с ненулевым статусом ошибки. Неинтерактивное сообщение об ошибке в порядке, я просто хочу избежать запроса пароля, вызывающего зависание моего приложения.
Как я могу этого добиться?
Ответ №1:
Вы можете установить GIT_TERMINAL_PROMPT
переменную среды на 0
, если вы не хотите, чтобы git запрашивал какой-либо ввод.
>>> git clone https://github.com/private/private.git
Cloning into 'private'...
Username for 'https://github.com':
>>> GIT_TERMINAL_PROMPT=0 git clone https://github.com/private/private.git
Cloning into 'private'...
fatal: could not read Username for 'https://github.com': terminal prompts disabled
В качестве альтернативы можно установить значение GIT_ASKPASS
переменной среды или core.askpass
конфигурации равным true
(или пустой скрипт).
>>> git clone https://github.com/private/private.git
Cloning into 'private'...
Username for 'https://github.com':
>>> GIT_ASKPASS=true git clone https://github.com/private/private.git
Cloning into 'private'...
remote: Repository not found.
fatal: Authentication failed for 'https://github.com/private/private.git/'
Оба решения имеют ненулевые коды выхода.
Комментарии:
1. false (1) обычно служит цели «ничего не делать и потерпеть неудачу». Нет необходимости в пустом скрипте.
2. Интересно. Существует ли какая-либо кроссплатформенная альтернатива, если такой
true
двоичный файл недоступен? Или мне придется отправлять такую программу вместе с моим сценарием?3. @shadowtalker: я считаю, что значения true(1) и false(1) задаются POSIX, поэтому они уже очень кроссплатформенны. Или, по крайней мере, такой же переносимый, как ожидание оболочки, которая выполнит пустой скрипт 🙂
4. @shadowtalker Я только что заметил
GIT_TERMINAL_PROMPT
переменную среды , которая может быть более элегантным решением.5. Я вообще не мог заставить это работать. Я клонирую через SSH , и он по-прежнему запрашивает пароль! Я пробовал различные значения для
core.askPass
,credential.helper
,GIT_ASKPASS
,SSH_ASKPASS
,GIT_TERMINAL_PROMPT
без какого-либо эффекта. Единственное, что я обнаружил, что помогло, этоGIT_SSH_COMMAND="ssh -o PasswordAuthentication=no"
Ответ №2:
В дополнение к GIT_TERMINAL_PROMPT=0
, следующее помогает также подавить диспетчер учетных данных Windows
git -c credential.helper= <rest of commands>