Git постоянно просит у меня пароль


665

Я уже некоторое время пользуюсь Git, но постоянные запросы на ввод пароля приводят меня в движение.

Я использую Mac OS X и GitHub, и я настроил Git и мои SSH-ключи в соответствии с инструкциями на странице GitHub Set Up Git .

Я также добавил ключ github SSH в свою цепочку ключей Mac OS X, как упоминалось на странице парольных фраз ключа GitHub . Мой открытый ключ зарегистрирован в Git.

Тем не менее, каждый раз, когда я пытаюсь Git pull, мне приходится вводить свое имя пользователя и пароль. Есть ли что-то кроме ключа SSH, который мне нужно настроить для этого?


1
Глупый вопрос, но вы убедились, что ключ SSH работает, когда просто используете ssh на машине с git?
Курт Штутсман,

4
Вы имеете в виду что-то вроде ssh -T git@github.com? Да, это работает просто отлично (если немного медленно).
Екатерина


Для https url вы можете использовать (с git1.8.3 +) помощник по учетным данным git ' netrc'. Смотрите полный пример здесь .
VonC

Я пользователь Windows, и я также столкнулся с проблемой запроса пароля даже после добавления моего открытого ключа в файл author_keys сервера. В действительности проблема заключалась в том, что я не держал свои открытые / закрытые ключи в папке .ssh в папке c: \ program files \ git. Если кто-то сталкивается с такой проблемой, пожалуйста, скопируйте ваши ключи в эту папку и попробуйте нажать / потянуть.
Раджа Амер Хан

Ответы:


797

Я думаю, что у вас неправильный URL Git-репозитория.

Откройте .git/configи найдите раздел [remote "origin"]. Убедитесь, что вы используете SSH:

ssh://git@github.com/username/repo.git

Вы можете увидеть SSH URL на главной странице вашего репозитория, если вы нажмете Clone или загрузите и выберите ssh .

И НЕ тот httpsили gitодин:

https://github.com/username/repo.git
git://github.com/username/repo.git

Теперь вы можете проверить с помощью только ключа SSH вместо имени пользователя и пароля.

Если Git жалуется 'origin' has already been added, откройте .configфайл и отредактируйте url = "..."часть после того, [remote origin]какurl = ssh://github/username/repo.git


То же самое касается других услуг. Убедитесь, что адрес выглядит так:protocol://something@url

Например, .git/configдля Azure DevOps:

[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

4
Это может быть этим. Когда я вызываю git remote -v, я получаю: origin github.com/Foo/Bar.git (fetch) origin github.com/Foo/Bar.git (push), тогда как для работы с SSH кажется, что это должно быть: origin git @ github.com: Foo / Bar.git (fetch) origin git@github.com: Foo / Bar.git (push) Это может быть потому, что я изначально проверил свой проект с помощью приложения Mac на GitHub ( mac.github.com ). Любая идея, как я могу это исправить?
Екатерина

8
Либо исправьте URL-адрес в файле .git / config, либо используйте git-remote для его исправления, либо удалите локальное хранилище и снова клонируйте его с правильным URL-адресом.
static_rtti

91
Просто чтобы объяснить это (как мне было нужно): откройте .git / config и в [remote "origin"]разделе set url = ssh://git@github.com/username/Repo.git. Это сработало для меня.
Грег К

13
Странно, решение @ GregK у меня не сработало, а url = git@github.com:organization/Repo.gitсработало. +1 за то, что вывели меня на правильный путь! Успех!
jmort253

3
Я не могу не подчеркнуть, насколько важно клонировать с помощью ssh: // git @ github / [username] / [reponame] .git, если вы хотите использовать ключ для доступа к GIT, не нужно каждый раз вводить имя пользователя и пароль , Я нашел единственный способ исправить это - удалить локальное хранилище и снова клонировать. $ Git clone ssh: // git @ github / [имя пользователя] / [reponame] .git
Джин Майерс

555

Настройка credential.helper

На OS X (теперь macOS), запустите это в Терминале :

git config --global credential.helper osxkeychain

Это позволяет Git использовать файл Keychain.app для хранения имени пользователя и пароля, а также для получения ключевой фразы для вашего личного ключа SSH из цепочки для ключей.

Для Windows используйте:

git config --global credential.helper wincred

Поиск проблемы

Если помощник по учетным данным Git настроен правильно, macOS сохраняет фразу-пароль в цепочке для ключей. Иногда связь между SSH и парольными фразами, хранящимися в цепочке для ключей, может разорваться. Запустите ssh-add -Kили, ssh-add ~/.ssh/id_rsaчтобы снова добавить ключ в связку ключей.

macOS v10.12 (Sierra) меняется на SSH

Для macOS v10.12 (Sierra) ssh-add -Kнеобходимо запускать после каждой перезагрузки. Чтобы избежать этого, создавайте ~/.ssh/configс этим контентом.

Host *
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/id_rsa

Со ssh_config manстраницы 10.12.2:

UseKeychain

В macOS указывает, должна ли система искать ключевые фразы в цепочке для ключей пользователя при попытке использовать определенный ключ. Когда пароль предоставляется пользователем, этот параметр также указывает, следует ли сохранять фразу-пароль в цепочке для ключей после того, как она будет проверена на правильность. Аргумент должен быть «да» или «нет». По умолчанию «нет».

Apple добавила Technote 2449, который объясняет, что произошло.

До macOS Sierra отображало sshдиалоговое окно с запросом вашей парольной фразы и предлагало сохранить ее в цепочке для ключей. Этот интерфейс был объявлен устаревшим некоторое время назад и был удален.


30
На данный момент это лучший способ сделать это, так как приложение Github для OSX (возможно, и для Windows) по умолчанию использует https-путь для git-репозиториев. Существует также хорошая причина для использования https, а не ssh / git, поскольку многие корпоративные сети разрешают трафик только через порты 80 и 443 по соображениям безопасности.
Codehugger

2
Вам нужен git 1.7.10 или новее, чтобы использовать помощник по учетным данным.
jbandi

3
+1 для решения keychain.app. Это здорово для меня, потому что git-сервер моего работодателя поддерживает только http, передаваемый через apache, и они настоятельно не рекомендуют использовать .netrcметод file, который помещает ваш пароль в открытый текст.
Джош

3
Обратите внимание, я получил ошибку, 'credential-osxkeychain' is not a git command.поскольку у меня не было установленного помощника по учетным данным. Я следовал инструкциям здесь, чтобы установить его: help.github.com/articles/set-up-git#password-caching
Hugh

2
Спасибо за обновление Sierra, я только что обновил и не мог понять, почему github продолжал запрашивать pw, когда я добавил git config --global credential.helper osxkeychainфайл конфигурации в мой .sshкаталог, исправил меня.
пиксель 67

139

Это случилось со мной, когда я обновил MacOS до версии 10.12 (Sierra). Похоже, агент SSH был очищен при обновлении.

$ ssh-add -L
The agent has no identities.

Просто бег ssh-addобнаружил мою существующую личность. Я ввел пароль, и было хорошо, чтобы пойти снова.


9
+1 сломано улучшением Сьерры. Обратите внимание, что пароль - это пароль для вашего ключа SSH, а не пароль пользователя Mac.
мобильность

1
Выполнение ssh-add работает, но, по-видимому, сбрасывается при закрытии окна терминала. Может быть, это новая «фича».
Joshd

Heads up - это произошло снова с другим обновлением Sierra (10.12.2), но применяется то же самое исправление.
Брайан

Кто-нибудь знает, как это не сбросить после закрытия Терминала?
nickjwallin

1
Я только что обновил свой MacBook Pro до 10.12.2, и он сломал мой мерзавец. Использование ssh-add полностью сработало для меня. Спасибо @amcc!
jimmyplaysdrums

68

Используйте это: замените github.com на соответствующее имя хоста

git remote set-url origin git@github.com:user/repo.git

У меня уже есть этот набор при просмотре git remote -v. Тем не менее, мне все еще предлагают пароль.
Игорь Ганапольский

То же самое, я установил как он предложил, но я все еще получаю запрос пароля, как я могу предотвратить это?
cyber8200

@IgorGanapolsky: Вы когда-нибудь находили решение для вас?
cyber8200

1
Это работает правильно. Это странно, что удаленный URL с git@**не запрашивает учетные данные, а URL с https@**делает :). Таким образом я нашел этот документ .
Суджит Кумар Сингх

54

Как уже говорили другие, вы можете установить помощник кеша паролей. Я просто хотел опубликовать ссылку для других платформ, а не только для Mac. Я использую сервер Linux, и это было полезно: кэширование вашего пароля GitHub в Git

Для Mac:

git credential-osxkeychain

Окна:

git config --global credential.helper wincred

Linux:

git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

5
Мне пришлось прокрутить вниз до третьего ответа, чтобы увидеть инструкции для Linux, они должны быть в основном ответе, так как это часто упоминаемая проблема.
KoldBane

22

Также ищите, кто спрашивает вас о парольной фразе. Это Git или ваш агент SSH?

В моем случае каждый раз, когда я делал git pullэто, он спрашивал меня:

Enter passphrase for key '/work/username/.ssh/id_rsa':

Итак, я предположил, что это Git просит пароль. Поэтому я продолжал искать решения, но потом понял, что мой агент SSH отключился. Который может быть исправлен с помощью eval $(ssh-agent)и ssh-addкак указано здесь.

Также ниже приведен небольшой фрагмент, который вы можете добавить в свой ~/.bashrcфайл (или эквивалентный), чтобы убедиться, что ваш агент SSH запущен при входе в систему.

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

# Start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."

    # Spawn ssh-agent
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
    echo succeeded
    chmod 600 ${SSH_ENV}
    . ${SSH_ENV} > /dev/null
    /usr/bin/ssh-add
}

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi


Уверен, что вам не хватает строки в приведенном выше коде - согласно stackoverflow.com/a/18915067/277023 вам нужно иметьSSH_ENV="$HOME/.ssh/environment"
kellyfj

20
git config credential.helper store

Примечание. Хотя это удобно, Git будет хранить ваши учетные данные в виде открытого текста в локальном файле (.git-credentials) в каталоге вашего проекта (см. Ниже каталог «home»). Если вам это не нравится, удалите этот файл и переключитесь на использование опции кеша.

Если вы хотите, чтобы Git продолжал запрашивать учетные данные каждый раз, когда ему нужно подключиться к удаленному репозиторию, вы можете запустить эту команду:

git config --unset credential.helper

Чтобы хранить пароли в .git-credentials в вашем каталоге% HOME%, а не в каталоге проекта: используйте флаг --global

git config --global credential.helper store

9

Руководство по Git в Windows и GitHub с использованием SSH для push / pull: Иллюстрированное руководство по Git в Windows

  1. Скачайте и установите PuTTY
  2. Установить переменную окружения 'GIT_SSH' = 'path \ to \ plink.exe' (в папке с установленной замазкой) - очень важно !!!
  3. Перезапустите Windows Explorer, чтобы переменные среды вступили в силу (нельзя перезапустить только командную строку)
  4. Запустите puttygen.exe для создания нового ключа, скопируйте открытый ключ на сайт GitHub
  5. Сохраните этот новый закрытый ключ где-нибудь в безопасности на диске (предпочтительно не Dropbox )
  6. Запустите putty.exe и подключите SSH к github.co
  7. Быстро попасть в папку автозагрузки, запустив «shell: startup».
  8. Запустите свой закрытый ключ с Windows через Pageant. Создайте ярлык в папке автозагрузки с синтаксисом "путь \ к \ pageant.exe", "путь \ к \ частному ключу"
  9. Нам не нужно устанавливать параметр «puttykeyfile» внутри .git / config наших репозиториев
  10. Очень важно , что «URL-адрес клонирования SSH» GitHub используется, а не HTTPS.

Никто не должен больше использовать замазку. Теперь вы можете делать все с помощью встроенных утилит Windows 10. Пусть замазка, просто замазка.
Ян Смит

9

В Windows для Git 1.7.9+ выполните следующую команду в командной строке, чтобы открыть файл конфигурации в текстовом редакторе:

    git config --global --edit

Затем в файле добавьте следующий блок, если его нет, или измените его соответствующим образом:

    [credential "https://giturl.com"]
        username = <user id>
         helper = wincred

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


это отлично работает, вы сэкономили мои часы, теперь я могу сосредоточиться на своей работе, большое спасибо, брат.
Мохаммед Суфиан

9

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

git config --global credential.helper 'cache --timeout 3600'

Я использовал его для Bitbucket и GitHub, он работает для обоих. Единственное, что вам нужно сделать, 3600это в считанные секунды. Увеличьте его до любой степени, которую вы хотите. Я поменял его на 259200который около 30 дней. Таким образом, я повторяю свой пароль каждые 30 дней или около того.


1
Хорошо, я обнаружил, что это не сохраняется после перезапуска, поэтому вам все равно нужно вводить пароль после перезапуска, независимо от времени ожидания ...
Бен Виндинг

Это хороший способ сделать в кеше :) Хотя бы сэкономил мое время. Спасибо
ChikuMiku

@BenWinding, потому что он хранит учетные данные в памяти.
3

5

Я полагаю, что вы исправили свою проблему, но я не вижу здесь решения, которое мне помогло, так что вот оно.

Введите в терминале:

echo "" > ~/.ssh/known_hosts

Это очистит ваш known_hostsфайл, и вам нужно будет добавить каждый хост, который вы использовали и подключились, но это решило проблему.


1
cat /dev/null > ~/.ssh/known_hostsбудет делать то же самое.
Жестянщик

5
> ~/.ssh/known_hostsеще короче :)
Коллин Аллен

rm ~ / .ssh / known_hosts тоже должен выполнить эту работу. Я бы посоветовал против этого, хотя.
orkoden

3
Если вам нужно удалить хост из ~ / .ssh / known_hosts, есть менее эффективный способ, чем уничтожить файл. ~ / .ssh / known_hosts - это просто текстовый файл, и если вы можете найти в нем нарушающие хосты, вы можете просто удалить их строки. Вы можете сделать резервную копию файла перед его редактированием. Если у вас есть только несколько записей в файле, то уничтожение может быть неплохой идеей. Я работаю на многих серверах, поэтому в моем ~ / .ssh / known_hosts есть сотни записей, и я не совсем готов удалить их все, чтобы удалить несколько записей.
Тим Стюарт,

3
@papan Это не мешает git спрашивать мой пароль!
Игорь Ганапольский

5

Я чувствую, что ответ, предоставленный static_rtti, в некотором смысле хакерский. Я не знаю, было ли это доступно ранее, но инструменты Git теперь предоставляют хранилище учетных данных.

Режим кэширования

$ git config --global credential.helper cache

Используйте режим «кэш», чтобы хранить учетные данные в памяти в течение определенного периода времени. Ни один из паролей никогда не хранится на диске, и они удаляются из кэша через 15 минут.

Режим магазина

$ git config --global credential.helper 'store --file ~/.my-credentials'

Используйте режим «хранилище», чтобы сохранить учетные данные в виде простого текстового файла на диске, и они никогда не истекают.

Я лично использовал режим магазина . Я удалил свой репозиторий, клонировал его, а затем мне пришлось один раз ввести свои учетные данные.

Ссылка: 7.14 Git Tools - Хранение учетных данных


Для Windows credential.helper cacheне работает. Так и должно быть git config --global credential.helper wincred.
Пауло Мерсон

Хранение его работало, и теперь оно позволяет мне фиксировать свои изменения без запроса пароля все время, вы спасатель!
g4ost

В Linux это сделало всю работу за меня git config --local credential.helper store. В моем случае, я использую HTTPS, таким образом я только один раз
набираю

3

Ответ orkoden на использование цепочки для ключей с Git в вашем терминале был неполным и вызывает ошибки. Вот что вам нужно сделать, чтобы сохранить имя пользователя и пароль, которые вы вводите в терминале в цепочке для ключей:

curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain
sudo mv git-credential-osxkeychain /usr/local/bin
sudo chmod u+x /usr/local/bin/git-credential-osxkeychain

Затем введите

git config --global credential.helper osxkeychain

Если вы уже выполнили часть с настройкой Git до того, как начать работу с curl, это не проблема; это сработает.


1
Что делать, если я на Linux.
Игорь Ганапольский

3

Как указано выше static_rtti, измените

https://github.com/username/repo.git
git://github.com/username/repo.git

в

ssh://git@github.com/username/repo.git

Я сам изменил httpsв файле .git / config на ssh, но он все еще не работал. Потом я увидел , что вы должны изменить github.comк git@github.com. Хороший способ получить действительный правильный URL-адрес - перейти на страницу своего проекта и нажать на эту ссылку:

Измените HTTPS на SSH, чтобы получить правильный URL

Затем добавьте этот URL в файл конфигурации.


У меня есть это в моем конфигурационном файле конфигурации, что еще я должен проверить?
cyber8200

Вы также изменили его на github.com?
CheesusCrust

3

В Windows Subsystem for Linux (WSL) это было единственное решение, которое я нашел работающим:

eval `SSH-agent` ; ssh-add ~/.ssh/id_rsa

Это была проблема с ssh-agent, который не был должным образом зарегистрирован в WSL.


Был whlie, но это то, что исправило мою проблему.
Нам Ким

3

Если вы хотите, чтобы Git не запрашивал учетные данные для входа в ваш репозиторий GitHub, это легко сделать.

Использование SSH вместо HTTPS

Вы можете обновить исходный пульт, используя SSH вместо HTTPS "

git remote set-url origin git@github.com:username/your-repo.git

Настройте Git для хранения вашего пароля и имени пользователя

Вот как вы можете заставить Git хранить имя пользователя и пароль:

git config --global credential.helper store

Затем сохраните имя пользователя и пароль для сеанса:

git config --global credential.helper cache

2

Я согласен с «codehugger» и, используя инструкцию «orkoden», она работала для меня - в NetBeans 7.3 - когда вы щелкаете правой кнопкой мыши по файлу и выбираете контекстное меню - push - открывается окно «push to remote» - есть два варианты здесь:

  1. origin:https://github.com/myaccount/myproject.git/

  2. https://github.com/myaccount/myproject.git/

Как видите, разница заключается в параметре origin в URL - вы не хотите выбирать эту опцию (1), вы хотите проверить опцию (2), и это прекрасно работает для меня.


2

Шаг 1: проверьте текущую конфигурацию

cat .git/config

Ты получишь:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/path_to_your_git.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[user]
    name = your_username
    email = your_email
[branch "master-staging"]
    remote = origin
    merge = refs/heads/master-staging

Шаг 2: удалите ваше удаленное происхождение

git remote rm origin

Шаг 3: добавьте удаленный источник обратно с вашим именем пользователя и паролем

git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git

После того, как вы снова добавили удаленный источник, вам также нужно выровнять свои филиалы удаленно и локально - что-то вроде этого: git branch --set-upstream master origin/master
Ричард Баун

2

Если Git запрашивает у вас имя пользователя и пароль каждый раз, когда вы пытаетесь взаимодействовать с GitHub, вы, вероятно, используете URL-адрес клонирования HTTPS для своего хранилища.

Использование удаленного URL-адреса HTTPS имеет ряд преимуществ: его проще настроить, чем SSH, и обычно он работает через строгие брандмауэры и прокси-серверы. Тем не менее, он также предлагает вам вводить учетные данные GitHub каждый раз, когда вы извлекаете или перемещаете хранилище.

Вы можете настроить Git для хранения вашего пароля. Для Windows :

git config --global credential.helper wincred

2

Запустив macOS Cataline 10.15, метод кэширования цепочки для ключей у меня не работал. И я хотел использовать https://неssh

Вот что сработало для меня:

git remote rm origin

git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git

Это должно работать и на GitLab

Убедитесь, что имя пользователя содержит адрес электронной почты, чтобы удалить @emailчасть, или вы получите сообщение об ошибкеURL using bad/illegal format or missing URL .

Надеюсь это поможет!


1
Это единственное решение, которое сработало для меня. your_git_username было критическим. На самом деле не нужно было ставить: your_git_password. На этом этапе, хотя он все еще запрашивал «фразу-пароль», теперь он будет принимать пароль учетной записи.
kbulgrien

1

Существуют разные виды аутентификации в зависимости от вашей конфигурации. Вот несколько из них:

  1. git credential-osxkeychain,

    Если ваши учетные данные недействительны, удалите их:

      git credential-osxkeychain erase
    

    или:

      printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
    

    Так что Git больше не будет просить у вас разрешения на связку ключей. Затем настройте его снова.

    Смотрите: Обновление учетных данных из OS X Keychain на GitHub

  2. Ваш ключ SSH RSA.

    Для этого вам нужно сравнить ваш SSH-ключ с тем, что вы добавили, проверьте ssh-add -L/, ssh-add -lесли вы используете правильный идентификатор.

  3. Ваша аутентификация HTTPS (если вы используете httpsвместо sshпротокола).

    Используйте ~/.netrc( %HOME%/_netrcв Windows), чтобы предоставить свои учетные данные, например,

      machine stash1.mycompany.com
      login myusername
      password mypassword
    

Узнайте больше: Синхронизация с GitHub при переполнении стека.




1

Если вы используете Windows, и это неожиданно начало происходить совершенно неожиданно на GitHub, это, вероятно, связано с недавней отключенной поддержкой GitHub устаревших криптографических алгоритмов на 2018-02-22, и в этом случае решение заключается в простой загрузке и установке. последняя версия либо полного Git для Windows, либо просто Git Credential Manager для Windows .


0

Решение для Microsoft Stack (Windows и Azure DevOps)

Сначала откройте .git/configфайл, чтобы убедиться, что адрес выглядит так:

protocol://something@url

Например .git / config для Azure DevOps:

[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

Если проблема не устранена, откройте диспетчер учетных данных Windows , нажмите на сейф с именем «Учетные данные Windows». устранена и удалите все учетные данные, связанные с git.

Теперь, когда вы в следующий раз войдете в git, он больше не исчезнет.


0

Если у вас настроен агент SSH, вы также можете добавить это в свой ~/.gitconfigкаталог, чтобы заставить git использовать SSH для всех репозиториев GitHub, а не HTTPS:

[url "ssh://git@github.com/"]
    insteadOf = git://github.com/
    insteadOf = https://github.com/

(Если вы в основном работаете с публичными репозиториями, вы также можете использовать pushInsteadOfвместо insteadOf, так как чтение из публичного репо может быть выполнено без аутентификации).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.