Git push требует имя пользователя и пароль - PullRequest
1270 голосов
/ 04 июля 2011

Я клонировал репозиторий Git со своей учетной записи GitHub на свой ПК.

Я хочу работать как с моим ПК, так и с ноутбуком, но с одной учетной записью GitHub.

Когда я пытаюсь нажатьЧтобы использовать GitHub с помощью моего компьютера или извлечь его, для этого требуются имя пользователя и пароль, но не при использовании ноутбука!

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

Ответы [ 21 ]

1769 голосов
/ 04 июля 2011

Распространенной ошибкой является клонирование с использованием по умолчанию (HTTPS) вместо SSH.Вы можете исправить это, перейдя в свой репозиторий, нажав «Клонировать или загрузить», затем нажав кнопку «Использовать SSH» над полем URL и обновив URL-адрес вашего удаленного источника, например:

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

Thisзадокументировано на GitHub: Переключение удаленных URL-адресов с HTTPS на SSH .

289 голосов
/ 17 февраля 2015

Постоянная аутентификация в репозиториях Git

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

$ git config credential.helper store
$ git push https://github.com/owner/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

Также следует указать срок действия кэширования истек,

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

После включения кэширования учетных данных оно будет кэшироваться в течение 7200 секунд (2 часа) .

128 голосов
/ 14 июня 2012

Я только что столкнулся с той же проблемой, и самым простым решением, которое я нашел, было использование SSH URL вместо HTTPS:

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

А не это:

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

теперь можно проверить с помощью просто ключ SSH вместо username и password.

116 голосов
/ 19 января 2013

Помимо перехода на SSH, вы также можете продолжать использовать HTTPS, если не возражаете, чтобы ввести пароль в виде открытого текста.Поместите это в ваш ~/.netrc, и он не будет запрашивать ваше имя пользователя / пароль (по крайней мере, для Linux и Mac):

machine github.com
       login <user>
       password <password>

Добавление (см. Второй комментарий VonC):в Windows имя файла %HOME%\_netrc.

Также прочитайте первый комментарий VonC на случай, если вы хотите зашифровать.

Еще одно добавление (см. комментарий user137717), которое вы можетеиспользуйте, если у вас Git 1.7.10 или новее .

Кэшируйте свой пароль GitHub в Git с помощью помощника по учетным данным :

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

Это также работает в Linux, Mac иОкна.

79 голосов
/ 13 февраля 2014

Для непосвященных, которые смущены предыдущими ответами, вы можете сделать:

git remote -v

, который ответит примерно так:

origin    https://yourname@github.com/yourname/yourrepo.git (fetch)
origin    https://yourname@github.com/yourname/yourrepo.git (push)

Затем вы можете выполнить команду много другихпредложили, но теперь вы знаете свое имя и свой репо сверху, так что вы можете просто вырезать и вставить yourname/yourrepo.git из вышеперечисленного в:

git remote set-url origin git@github.com:yourname/yourrepo.git
53 голосов
/ 21 августа 2013

Если вы используете SSH и ваш закрытый ключ зашифрован с помощью ключевой фразы, тогда вам все равно будет предложено ввести пароль / пароль для личного ключа при выполнении сетевых операций с Git как push, pull и fetch.

Используйте ssh-agent для сохранения пароля-пароля / пароля.

Если вы хотите избежать необходимости вводить вашу парольную фразу каждый раз, вы можете использовать ssh-agent для хранения ваших парольных фраз личного ключа один раз за сеанс терминала, как я объясняю в мой ответ на Не удалось открыть соединение с вашим агентом аутентификации :

$ eval `ssh-agent -s`
$ ssh-add

В Windows msysgit Bash вам нужно оценить вывод ssh-agent, но я не уверен, нужно ли вам делать то же самое в других средах разработки и операционных системах.

ssh-add ищет закрытый ключ в вашей домашней папке .ssh с именем id_rsa, который является именем по умолчанию, но вы можете передать путь к файлу для ключа с другим именем.

Убить агента

Когда вы закончите сеанс терминала, вы можете отключить ssh-agent с флагом уничтожения -k:

$ ssh-agent -k

Как объяснено в ssh-agent руководстве :

-k

Убить текущего агента (заданного переменной среды SSH_AGENT_PID).

Дополнительное время ожидания

Кроме того, он может принимать необязательный параметр тайм-аута, например:

$ ssh-add -t <timeout>

где <timeout> имеет формат <n>h для <n> часов, <n>m для <n> минут и т. Д.

В соответствии с ssh-agent руководством :

-t life

Установите значение по умолчанию для максимального времени жизни идентификаторов, добавляемых к агенту. Время жизни может быть указано в секундах или в формат времени, указанный в sshd_config (5) . Время жизни, указанное для идентификатора с помощью ssh-add (1) , переопределяет это значение. Без этой опции максимальное время жизни по умолчанию - навсегда.

См. Эту страницу для большего количества форматов времени .

Предупреждение безопасности для пользователей Cygwin

Пользователи Cygwin должны знать о потенциальной угрозе безопасности при использовании ssh-agent в Cygwin :

люди должны быть осведомлены о потенциальная опасность ssh-agent под Cygwin 1 , хотя при локальном netstat и удаленном сканировании портов не видно, что порт, указанный в / tmp / ssh-foo, доступен любому ...?

[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html

А по цитируемой ссылке :

однако, обратите внимание, что доменные сокеты Cygwin Unix FUNDAMENTALLY INSECURE и поэтому я настоятельно DISCOURAGE используем ssh-agent под Cygwin.

когда вы запускаете ssh-agent в Cygwin, он создает сокет AF_UNIX в каталоге /tmp/ssh-$USERNAME/. Под Cygwin сокеты AF_UNIX эмулируются через сокеты AF_INET. Вы можете легко увидеть это, если загляните в файл /tmp/ssh-$USERNAME/agent-socket-* через Блокнот. Вы увидите что-то вроде

!<socket >2080

тогда беги netstat -a и удивляйся! У вас есть программа, слушающая порт 2080. Это ssh-agent. Когда ssh получает запрос RSA от сервера, он ссылается на соответствующий /tmp/ssh-$USERNAME/agent-socket-* (в нашем случае это означает, что в Cygwin это откроет соединение с localhost:2080) и просит ssh-agent обработать вызов RSA с частным ключ, который он имеет, и затем просто передает ответ, полученный от ssh-agent, на сервер.

В Unix такой сценарий работает без проблем, поскольку ядро ​​Unix проверяет разрешения, когда программа пытается получить доступ к сокету AF_UNIX. Однако для сокетов AF_INET соединения являются анонимными (читайте "Небезопасные"). Представьте, что у вас запущен ssh-агент Cygwin. Вредоносный хакер может портить ваш ящик, найти открытый порт, используемый ssh-agent, открыть соединение с вашим SSH-сервером, получить от него запрос RSA, отправить его вашему ssh-agent через открытый порт, который он / она нашел, получить Ответ RSA, отправьте его на сервер SSH и вуаля, он / она успешно вошел на ваш сервер как вы.

47 голосов
/ 01 сентября 2013

Источник: Настройка Git

Следующая команда сохранит ваш пароль в памяти на некоторое время (для Git 1.7.10 или новее).

$ git config --global credential.helper cache
# Set git to use the credential memory cache

$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after one hour (setting is in seconds)
30 голосов
/ 25 декабря 2013

Когда вы используете https для Git pull & push, просто настройте remote.origin.url для своего проекта, чтобы избежать ввода имени пользователя (или / и пароля) при каждом нажатии.

Как настроить remote.origin.url:

URL format:
    https://{username:password@}github.com/{owner}/{repo}

Parameters in URL:

* username <br/>
    Optional, the username to use when needed. <br/> authentication,
    if specified, no need to enter username again when need authentication.
    Don't use email; use your username that has no "@", otherwise the URL can't be parsed correctly,
* password
    optional, the password to use when need authentication.
    If specified, there isn't any need to enter the password again when needing authentication.
    Tip:
        this value is stored as plain text, so for security concerns, don't specify this parameter,
*

e.g
    git config remote.origin.url https://eric@github.com/eric/myproject


@ Обновить - используя ssh

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

Грубые шаги:

  • Создайте ssh-ключи, используя команду, например, ssh-keygen в Linux, в Windows msysgit предоставьте аналогичные команды.
  • Храните закрытый ключ на локальном компьютере в правильном месте, например, ~/.ssh. И добавьте его в агент ssh с помощью команды ssh-add.
  • Загрузите открытый ключ на сервер Git.
  • Измените remote.origin.url хранилища Git на стиль ssh, например, git@gitlab.com:myaccount/myrepo.git
  • Тогда когда вы тянете или толкаете, больше нет необходимости вводить имя пользователя или пароль.

Советы:

  • Если у вашего ключа ssh есть фраза-пароль, вам нужно вводить ее при первом использовании ключа после каждого перезапуска вашего компьютера, по умолчанию.

@ Update - переключение между протоколами https и ssh.

Достаточно просто изменить remote.origin.url, или вы можете отредактировать repo_home/.git/config напрямую, чтобы изменить значение (например, используя vi в Linux).

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

* 1065 Е.Г. *

[remote "origin"]
        url = git@gitlab.com:myaccount/myrepo.git
        # url = https://myaccount@gitlab.com/myaccount/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
15 голосов
/ 19 декабря 2014

Вы можете кешировать свой пароль GitHub в Git:

Просто следуйте инструкциям официальной документации GitHub .

После следования инструкциям по приведенной выше ссылке, вы должныиметь возможность вставлять / извлекать данные из вашего хранилища, не вводя имя пользователя и пароль каждый раз.

8 голосов
/ 24 апреля 2018

Вот еще один вариант:

Вместо записи

git push origin HEAD

Вы можете написать:

git push https://user:pass@yourrepo.com/path HEAD

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

...