Git push требует имени пользователя и пароля

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

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

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

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

Ответы

Ответ 1

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

git remote set-url origin [email protected]:username/repo.git

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

Ответ 2

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

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

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

Username for 'https://github.com': <USERNAME>
Password for 'https://[email protected]': <PASSWORD>

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

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

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

Ответ 3

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

ssh://[email protected]/username/repo.git

И не это

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

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

Ответ 4

Помимо перехода на 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 и Windows.

Ответ 5

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

git remote -v

Который ответит что-то вроде

origin    https://[email protected]/yourname/yourrepo.git (fetch)
origin    https://[email protected]/yourname/yourrepo.git (push)

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

git remote set-url origin [email protected]:yourname/yourrepo.git

Ответ 6

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

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

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

$ eval 'ssh-agent -s'
$ ssh-add

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

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

Убить агента

Когда вы закончите сеанс терминала, вы можете ssh-agent с флагом kill -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 -a dd (1), переопределяет это значение. Без этой опции максимальное время жизни по умолчанию - навсегда.

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

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

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

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

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

И по приведенной ссылке:

Тем не менее, обратите внимание, что доменные сокеты Cygwin Unix являются ФУНДАМЕНТАЛЬНО НЕДОСТАТОЧНЫМИ, и поэтому я категорически не рекомендую использовать ssh -a для Cygwin.

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

!<socket >2080

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

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

Ответ 7

Источник: Настройка 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)

Ответ 8

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

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

URL format:
    https://{username:[email protected]}github.com/{owner}/{repo}

Parameters in URL:

* username 
Optional, the username to use when needed.
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://[email protected]/eric/myproject

@Update - использование ssh

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

Грубые шаги:

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

Подсказки:

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

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

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

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

Например

[remote "origin"]
        url = [email protected]:myaccount/myrepo.git
        # url = https://[email protected]/myaccount/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*

Ответ 9

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

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

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

Ответ 10

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

Вместо того чтобы писать

git push origin HEAD

Вы могли бы написать:

git push https://user:[email protected]/path HEAD

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

Ответ 11

Для меня работала редактирование .git/config и использование

[remote "origin"]
        url = https://<login>:<password>@gitlab.com(...).git

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

Ответ 12

У вас в основном есть два варианта.

Если вы используете одного и того же пользователя на обеих машинах, вам нужно скопировать ключ .pub на ваш ПК, чтобы GitHub знал, что вы один и тот же пользователь.

Если вы создали новый файл .pub для своего ПК и хотите относиться к машинам как к другим пользователям, вам необходимо зарегистрировать новый файл .pub на веб-сайте GitHub.

Если это все еще не работает, это может быть из-за того, что ssh не настроен правильно и ssh не может найти расположение ваших ключей. Пытаться

ssh -vv [email protected]

Чтобы получить больше информации, почему SSH не работает.

Ответ 13

Обновление для HTTPS:

GitHub запустил новую программу для Windows, которая хранит ваши учетные данные при использовании HTTPS:

Использовать:

  • Скачать программу отсюда

  • Как только вы запустите программу, она отредактирует ваш файл .gitconfig. .gitconfig отредактировал ли он правильный .gitconfig если у вас их несколько. Если он не отредактировал правильный, добавьте следующее в ваш .gitconfig

    [credential]
        helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'
    

    ПРИМЕЧАНИЕ разрыв строки после [credential]. Требуется.

  • Откройте клиент командной строки и попробуйте один раз git push origin master. Если он запрашивает у вас пароль, введите его и все. Пароль сохранен!

Ответ 14

Если ключ SSH или файл .netrc не работают для вас, то вам может подойти другое простое, но менее безопасное решение - git-credential-store - Помощник для хранения учетных данных на диске:

git config --global credential.helper store

По умолчанию учетные данные будут сохранены в файле ~/.git-credentials. Он будет создан и записан.

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

Ответ 15

Я была такая же проблема.

Поэтому я изменил файл .git/config из своего проекта,

url = https://github.com/<your-user-here>/<your-repo-here>

в

url = [email protected]:<your-user-here>/<your-repo-here>

и добавил открытый ключ SSH в профиль Git, который находится в настройке.

Для открытого ключа SSH:

cat ~/.ssh/id_rsa.pub

Ответ 16

Вам нужно выполнить два шага -

  1. git remote remove origin
  2. git remote add origin [email protected]:NuggetAI/nugget.git

Обратите внимание, что URL Git является URL-адресом SSH, а не URL-адресом HTTPS... Который вы можете выбрать здесь:

Enter image description here

Ответ 17

Для пользователей Windows Git, после запуска git config --global credential.helper store, если он по-прежнему запрашивает пароль, лучше проверить, куда записывается файл конфигурации, используя эту команду

git config --list --show-origin

В моем случае после ручного редактирования файла конфигурации 'C:\Program Files\Git\mingw64\etc\gitconfig' и добавления следующего текста все заработало.

[credential]
    helper = store

Ответ 18

Обновите файл конфигурации Git напрямую (если вы не хотите запоминать необычные команды):

Откройте файл .git/config в вашем любимом текстовом редакторе. Он будет в папке, которую вы клонировали, или в репозитории, в котором вы выполняли git init. Перейдите в этот репозиторий. .git является скрытой папкой, и нажатие Ctrl + H должно показать скрытую папку (ls -a в терминале).

Ниже приведен пример файла .git/config. Скопируйте и вставьте эти строки и обязательно обновите эти строки своей информацией Git.

[user]
        name = Tux
        email = [email protected]
        username = happy_feet

[remote "origin"]
        url = https://github.com/happy_feet/my_code.git
        fetch = +refs/heads/*:refs/remotes/origin/*

Измените часть URL со следующим форматом для SSH:

url = [email protected]:happy_feet/my_code.git

(Приведенные выше форматы не меняются на различных удаленных серверах Git, таких как GitHub или Bitbucket. То же самое, если вы используете Git для контроля версий):

Примечание: способ подключения SSH к удаленному репозиторию Git потребует от вас добавления вашего открытого ключа SSH на удаленный сервер Git (например, GitHub или Bitbucket. Найдите на странице настроек ключи SSH).

Чтобы узнать, как генерировать ключи SSH, обратитесь к разделу: Создание ключей SSH.

Ответ 19

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

git remote set-url origin https://[email protected]/username/reponame.git

Пример:

git remote set-url origin https://[email protected]/jsmith/master.git

Ответ 20

Если вы используете Git (например, Git Bash) под Windows (и если вы не хотите переключаться с HTTPS на SSH), вы также можете использовать Git Credential Manager для Windows

Это приложение будет хранить имя пользователя и пароль для вас...

Ответ 21

Как говорили многие пользователи, вам просто нужно изменить URL-адрес хранилища Git с HTTPS на SSH.

Если вы не сгенерировали SSH-ключ на своем компьютере, вам придется это сделать.

Так же, как дополнительная информация, после этого изменения я все еще получал ту же ошибку:

Доступ запрещен.

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

Итак, мне просто нужно было открыть оболочку Git и выполнить там команду ngh, помещать фразу SSH в запрос каждый раз, когда она его запрашивала, и "вуаля"... Это просто отлично работало!

Ответ 22

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone [email protected]:corp/project.git

    export git_msg="my commit msg with my corporate identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <[email protected]>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone [email protected]:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <[email protected]>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # stop :: how-to use different ssh identity files