Принудительный сбой Git, когда требуется пароль, вместо запроса пароля

#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>