Как отключить помощник по учетным данным в git для одного репозитория?

Если у меня есть помощник по учетным данным, установленный в моем ~/.gitconfig Как я могу отключить / обойти его в конкретном репо и не использовать помощник учетных данных?

Я пытался редактировать репо .git/config файл, чтобы убрать credential.helper свойство как это:

[credential]
    helper = 

... но когда я делаю git push Я получаю следующее сообщение об ошибке, и Git использует мой помощник по умолчанию из ~/.gitconfig тем не мение:

git: 'credential-' is not a git command. See 'git --help'.

Did you mean this?
        credential

Я использую GIT версии 1.7.12.

(Предыстория / случай использования: Git настроен на использование store помощник, который хранит незашифрованные пароли на диске. cache помощник недоступен в этой системе. У меня есть пара репозиториев, для которых я бы предпочел каждый раз вводить пароль, а не хранить его на диске.)

4 ответа

Решение

С git 2.9 (июнь 2016 г.), это (helper =) будет реально работать!

Смотрите коммит 2432137 (26 февраля 2016 г.) Джеффа Кинга ( peff )
(Объединено Юнио С Хамано - gitster - в коммите 1b68962, 3 апреля 2016 г.)

credential.helper Переменная конфигурации является накопительной, и нет хорошего способа переопределить ее из командной строки.
В качестве особого случая предоставление пустой строки в качестве значения теперь служит сигналом для очистки значений, указанных в различных файлах.

credential: пусть пустые учетные данные сбрасывают список помощников

Так как credential.helper Ключ является многозначным списком конфигурации, нет способа "сбросить" помощника, как только он был установлен. Так что если ваша система /etc/gitconfig устанавливает один, вы никогда не сможете избежать его запуска, а только добавите своих собственных помощников сверху.

Поскольку пустое значение для credential.helper бессмысленно (он просто попытается запустить " git-credential- "), мы можем предположить, что никто не использует его. Давайте определим его для сброса списка помощников, что позволит вам переопределить экземпляры с более низким приоритетом, которые были раньше.

То, что я пробовал и хорошо сработало, было:

$ git config --system --unset credential.helper

Но для того, чтобы это работало нормально, мне пришлось установить git-bash.exe с правами администратора.

К сожалению, я думаю, что это глобальная переменная. Вы должны проверить и посмотреть, работает ли он для отдельных репозиториев.

Удачи

В дополнение к ' git config credential.helper= "Что я упоминал выше с Git 2.9, теперь вы (Git 2.13.x/Git 2.14, Q3 2017) можете отключить помощник по учетным данным только для одной команды (а не только для любой команды в данном репо)

Это означает git -c credential.helper= clone /url/remote/repo в настоящее время работает.

" git clone --config var=val msgstr "это способ заполнить файл конфигурации для каждого репозитория нового репозитория, но он не сработал, когда val - пустая строка.
Это было исправлено.

Смотрите коммит db4eca1 (02 мая 2017 г.) Джонатана Нидера ( artagnon )
(Объединено Юнио С Хамано - gitster - в коммите 883247c, 16 мая 2017 г.)

clone: обрабатывать пустые значения конфигурации в -c

" git clone --config "использует следующее заклинание для добавления элемента в файл конфигурации вместо замены существующего значения:

git_config_set_multivar_gently(key, value, "^$", 0)

Пока никакое существующее значение не соответствует регулярному выражению ^$, который работает как задумано и добавляет в конфиг. Когда значение пустое, оно заменяет существующее.

Заметил, пытаясь установить credential.helper во время клона использовать определенный помощник без наследования от ~/.gitconfig а также /etc/gitconfig,
То есть я побежал:

git clone -c credential.helper= \
     -c credential.helper=myhelper \
     https://example.com/repo

намереваясь произвести конфигурацию:

[credential]
     helper =
     helper = myhelper

Без этого патча helper = 'строка не включена, и помощник по учетным данным из /etc/gitconfig привыкает.


Обратите внимание, что документация теперь яснее с коммитом 515360f:

документ, подтверждающий личность: сделать поведение нескольких помощников более заметным

Система конфигурации Git работает, читая несколько файлов конфигурации по порядку, от общего к конкретному:

  • во-первых, конфигурация системы /etc/gitconfig
  • тогда конфигурация пользователя (~/.gitconfig или же ~/.config/git/config)
  • тогда конфигурация репозитория (.git/config)

Для однозначных элементов конфигурации побеждает последнее значение.
Для многозначных элементов конфигурации значения накапливаются в этом порядке.

Например, это позволяет глобально установить помощника по учетным данным в ~/.gitconfig этот git будет пытаться использовать во всех репозиториях, независимо от того, предоставляют ли они дополнительно другого помощника.
Обычно это хорошая вещь - например, я могу установить помощников для использования моей цепочки ключей ОС и для кэширования учетных данных в течение короткого периода времени во всем мире.

Иногда люди хотят иметь возможность переопределить унаследованные настройки.
Для credential.helper установка, это делается путем установки элемента конфигурации пустым, прежде чем дать ему новое значение.

Переменная config, для которой задана пустая строка, отличается от неустановленной переменной. Невозможно заставить переменную быть сброшенной в .git/config когда он уже установлен в ~/.gitconfig,

Дополнительно credential.helper является одной из этих переменных, где используются несколько значений, и в таких случаях значения агрегируются из всех прочитанных файлов конфигурации.

Так что в основном ваши варианты выглядят так:

  • либо не использовать credential.helper в ~/.gitconfig; установить помощник магазина только для тех хранилищ, где вы хотите, либо в их .git/configили в ~/.gitconfig указав URL репо, например.

    [credential "https://specific.example.com/repo.git"]
    helper = store
    
  • или реализовать свой собственный помощник, который ничего не делает для набора настроенных репозиториев и делегатов git credential-store что касается прочего.

Я просто столкнулся с этой проблемой, так как первый настроенный мной credential.helper всегда выполнялся, когда я хотел протестировать новый. Это на macOS с использованием git, поставляемого с инструментами разработчика Apple.

Перечисление конфигов с git config --list показал оба помощника.

Бег git config --global --edit не показывал настройки для первого помощника. Немного странно, что --global при настройке помощника отличается от --global при редактировании конфигов.

Кроме того, так как я хотел включить другого помощника, простое отключение не решило бы это.

Наконец нашел настройки в двух местах:

  • /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
  • /Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig

Удален раздел учетных данных из первого, но оба параметра все еще были перечислены с помощью --list, После перезагрузки и попытки каждого комбо unset, unset-all --system, --global, et, я нашел второй файл.

Удалил настройки из этого файла (снова был только один) и, наконец, --list не показывает никаких настроенных помощников.

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