Есть ли способ кэшировать учетные данные GitHub для отправки коммитов?

Недавно я переключился на синхронизацию своих репозиториев с https://на GitHub (из-за проблем с брандмауэром), и он каждый раз запрашивает пароль.

Есть ли способ кэшировать учетные данные вместо аутентификации каждый раз, когда git push?

Ответ 1

С Git версии 1.7.9 и выше

Начиная с Git 1.7.9 (выпущенной в конце января 2012 года), в Git существует изящный механизм, позволяющий избежать необходимости постоянно вводить пароль для HTTP/HTTPS, называемый помощниками по учетным данным. (Спасибо dazonic за указание этой новой функции в комментариях ниже.)

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

git config --global credential.helper cache

... который говорит Git хранить ваш пароль в кеше (по умолчанию) в течение 15 минут. Вы можете установить более длительное время ожидания с помощью:

git config --global credential.helper "cache --timeout=3600"

(Этот пример был предложен на странице справки GitHub для Linux.) При желании вы также можете хранить свои учетные данные постоянно, см. Другие ответы ниже.

Справка GitHub также предполагает, что если вы используете Mac OS X и использовали Homebrew для установки Git, вы можете использовать встроенное хранилище ключей Mac OS X с:

git config --global credential.helper osxkeychain

Для Windows есть помощник под названием Git Credential Manager для Windows или wincred в msysgit.

git config --global credential.helper wincred # obsolete

С Git для Windows 2.7. 3+ (март 2016 г.):

git config --global credential.helper manager

Для Linux вы можете использовать gnome-keyring (или другую реализацию ключей, такую как KWallet).

С версиями Git до 1.7.9

В версиях Git до 1.7.9 эта более безопасная опция недоступна, и вам потребуется изменить URL-адрес, используемый вашим origin пультом, чтобы включить пароль следующим образом:

https://you:[email protected]/you/example.git

... другими словами с :password после имени пользователя и перед @.

Вы можете установить новый URL - адрес для вашего origin пульта дистанционного управления с:

git config remote.origin.url https://you:[email protected]/you/example.git

Убедитесь, что вы используете https, и вы должны знать, что если вы сделаете это, ваш пароль GitHub будет сохранен в виде открытого текста в вашем каталоге .git, что, очевидно, нежелательно.

С любой версией Git (ну, начиная с версии 0.99)

Альтернативный подход заключается в том, чтобы поместить ваше имя пользователя и пароль в файл ~/.netrc, хотя, как и в случае с сохранением пароля в удаленном URL-адресе, это означает, что ваш пароль будет храниться на диске в виде простого текста и, следовательно, будет менее безопасным и не рекомендуется. Однако, если вы хотите использовать этот подход, добавьте следующую строку в ваш ~/.netrc:

machine <hostname> login <username> password <password>

... заменив <hostname> сервера, а <username> и <password> своим именем пользователя и паролем. Также не забудьте установить ограничительные разрешения файловой системы для этого файла:

chmod 600 ~/.netrc

Обратите внимание, что в Windows этот файл должен называться _netrc, и вам может потребоваться определить переменную среды% HOME% - для получения дополнительной информации см.:

Ответ 2

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

git config credential.helper store

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

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

git config --unset credential.helper

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

git config --global credential.helper store

Ответ 3

TL;DR; Используйте зашифрованный файл netrc с Git 1.8. 3+.

Сохранение пароля для URL-адреса HTTPS хранилища Git возможно с помощью ~/.netrc (Unix) или %HOME%/_netrc (обратите внимание на _) в Windows.

Но: этот файл будет хранить ваш пароль в виде простого текста.

Решение: зашифруйте этот файл с помощью GPG (GNU Privacy Guard) и заставляйте Git расшифровывать его каждый раз, когда ему потребуется пароль (для операции push/pull/fetch/clone).


Примечание: с Git 2.18 (Q2 2018) вы теперь можете настроить GPG, используемый для расшифровки зашифрованного файла .netrc.

Смотрите коммит 786ef50, коммит f07eeed (12 мая 2018) Луиса Марсано ('').
(Объединено Junio C Hamano - gitster - в коммите 017b7c5, 30 мая 2018 г.)

git-credential-netrc: принять опцию gpg

git-credential-netrc был жестко закодирован для расшифровки с помощью ' gpg ' независимо от параметра gpg.program.
Это проблема в таких дистрибутивах, как Debian, которые называют современную GnuPG чем-то другим, например, ' gpg2 '


Пошаговые инструкции для Windows

С Windows:

(В дистрибутиве Git есть gpg.exe, но при полной установке GPG имеется gpg-agent.exe, который запоминает вашу фразу-пароль, связанную с вашим ключом GPG.)

  • Установите gpg4Win Lite, минимальный интерфейс командной строки gnupg (возьмите самый последний gpg4win-vanilla-2.XY-betaZZ.exe), и заполните свой PATH установочным каталогом GPG:

    set PATH=%PATH%:C:\path\to\gpg
    copy C:\path\to\gpg\gpg2.exe C:\path\to\gpg\gpg.exe
    

(Обратите внимание на команду " copy ": Git понадобится сценарий Bash для выполнения команды " gpg ". Поскольку gpg4win-vanilla-2 поставляется с gpg2.exe, вам необходимо продублировать его.)

  • Создайте или импортируйте ключ GPG и доверяйте ему:

    gpgp --import aKey
    # or
    gpg --gen-key
    

(Удостоверьтесь, чтобы поставить ключевую фразу к этому ключу.)

  • Доверься этому ключу

  • Установите вспомогательный сценарий учетных данных в каталоге в вашем %PATH%:

    cd c:\a\fodler\in\your\path
    curl -o c:\prgs\bin\git-credential-netrc https://raw.githubusercontent.com/git/git/master/contrib/credential/netrc/git-credential-netrc
    

(Да, это скрипт Bash, но он будет работать в Windows, так как он будет вызываться Git.)

  • Сделайте файл _netrc открытым текстом

    machine a_server.corp.com
    login a_login
    password a_password
    protocol https
    
    machine a_server2.corp.com
    login a_login2
    password a_password2
    protocol https
    

(Не забудьте часть " protocol ": " http " или " https " в зависимости от того, какой URL вы будете использовать.)

  • Зашифруйте этот файл:

    gpg -e -r a_recipient _netrc
    

(Теперь вы можете удалить файл _netrc, оставив только зашифрованный файл _netrc.gpg.)

  • Используйте этот зашифрованный файл:

    git config --local credential.helper "netrc -f C:/path/to/_netrc.gpg -v"
    

(Обратите внимание, что ' / ': C:\path\to... не будет работать вообще.) (Сначала вы можете использовать -v -d чтобы увидеть, что происходит.)

С этого _netrc.gpg любая команда Git, использующая URL-адрес HTTP (S), который требует аутентификации, будет дешифровать этот файл _netrc.gpg и использовать логин/пароль, связанный с сервером, с которым вы связываетесь. В первый раз, GPG попросит вас ввести пароль вашего ключа GPG, чтобы расшифровать файл. В других случаях gpg-agent, автоматически запускаемый при первом вызове GPG, предоставит вам эту фразу-пароль.

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

Ответ 4

Там простой, старомодный способ хранения учетных данных пользователя в URL-адресе HTTPS:

https://user:[email protected]/...

Вы можете изменить URL с помощью git remote set-url <remote-repo> <URL>

Очевидным недостатком этого подхода является то, что вы должны хранить пароль в виде обычного текста. Вы все равно можете просто ввести имя пользователя (https://[email protected]/...), которое, по крайней мере, избавит вас от хлопот.

Вы можете переключиться на SSH или использовать клиентское программное обеспечение GitHub.

Ответ 6

Вы можете просто использовать

git config credential.helper store

Когда вы в следующий раз введете пароль с помощью команды pull или push, он будет сохранен в файле .git-credentials в виде простого текста (немного небезопасно, но просто поместите его в защищенную папку).

И это, как указано на этой странице:

git-credential-store

Ответ 7

Для меня не сразу было очевидно, что мне нужно сначала скачать помощника! Я нашел загрузку credential.helper на Atlassian Постоянная аутентификация с репозиториями Git.

Цитата:

Выполните следующие действия, если вы хотите использовать Git с кэшированием учетных данных в OS X:

Загрузите двоичный файл git-credential-osxkeychain.

Запустите команду ниже, чтобы убедиться, что двоичный файл является исполняемым:

chmod a+x git-credential-osxkeychain

Поместите его в каталог /usr/local/bin.

Запустите команду ниже:

git config --global credential.helper osxkeychain

Ответ 8

Просто включите регистрационные данные как часть URL:

git remote rm origin
git remote add origin https://username:[email protected]/path/to/repo.git

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

Ответ 9

В настройках GNU/Linux, ~/.netrc работает также хорошо:

$ cat ~/.netrc
machine github.com login lot105 password howsyafather

Это может зависеть от того, какие сетевые библиотеки Git используется для транспорта HTTPS.

Ответ 10

Для Windows вы можете использовать плагин Git Credential Manager (GCM). В настоящее время поддерживается Microsoft. Приятно то, что он сохраняет пароль в хранилище учетных данных Windows, а не в виде простого текста.

На странице релизов проекта есть установщик. Это также установит официальную версию Git для Windows со встроенным менеджером учетных данных. Это позволяет двухфакторную аутентификацию для GitHub (и других серверов). И имеет графический интерфейс для первоначального входа в систему.

Для пользователей Cygwin (или пользователей, уже использующих официальный Git для Windows), вы можете предпочесть установку вручную. Загрузите пакет zip со страницы релизов. Распакуйте пакет и запустите файл install.cmd. Это установит в вашу папку ~/bin. (Убедитесь, что ваш каталог ~/bin находится в вашем PATH.) Затем вы настраиваете его с помощью этой команды:

git config --global credential.helper manager

Затем Git запустит git-credential-manager.exe при аутентификации на любом сервере.

Ответ 11

Если вы не хотите хранить свой пароль в незашифрованном виде, как сказал Марк, вы можете использовать другой URL-адрес GitHub для извлечения, чем для отправки. В вашем конфигурационном файле в разделе [remote "origin"]:

url = git://github.com/you/projectName.git
pushurl = [email protected]:you/projectName.git

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

Ответ 12

OAuth

Вы можете создать свой собственный персональный API-токен (OAuth) и использовать его так же, как и обычные учетные данные (по адресу: /settings/tokens). Например:

git remote add fork https://[email protected]/foo/bar
git push fork

.netrc

Другой способ заключается в настройке вашего пользователя/пароля в ~/.netrc (_netrc в Windows), например

machine github.com
login USERNAME
password PASSWORD

Для HTTPS добавьте дополнительную строку:

protocol https

Помощник по учету

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

  • Mac: git config --global credential.helper osxkeychain (osxkeychain helper),
  • Windows: git config --global credential.helper wincred
  • Linux и другие: git config --global credential.helper cache

Связанные с:

Ответ 13

Вы можете использовать помощники учетных данных.

git config --global credential.helper 'cache --timeout=x'

где x - количество секунд.

Ответ 14

После клонирования репозитория repo, вы можете редактировать repo/.git/config и добавить некоторую конфигурацию, как показано ниже:

[user]
    name = you_name
    password = you_password
[credential]
    helper = store

Тогда вас больше не попросят ввести username и password.

Ответ 15

Я знаю, что это не безопасное решение, но иногда вам нужно просто простое решение - без установки чего-либо еще. И поскольку helper = store у меня не работал, я создал вспомогательный помощник:

Создайте сценарий и поместите его в папку bin вашего пользователя, здесь с именем credfake, этот сценарий предоставит ваше имя пользователя и ваш пароль:

#!/bin/bash
while read line
do
  echo "$line"
done < "/dev/stdin"
echo username=mahuser
echo password=MahSecret12345

сделать его исполняемым:

chmod u+x /home/mahuser/bin/credfake

затем настройте его в git:

git config --global credential.helper /home/mahuser/bin/credfake

(или используйте его без --global только для одного репо)

и - voilá - git будет использовать этот пользователь + пароль.

Ответ 16

Вместо пароля учетной записи следует использовать токен аутентификации. Перейдите в настройки/приложения GitHub, а затем создайте токен доступа. Маркер может использоваться так же, как и пароль.

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


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

  • Напишите файл конфигурации SSH, содержащий Host, IdentityFile для ключа развертывания, возможно, UserKnownHostsFile и, возможно, User (хотя я думаю, что вам это не нужно).
  • Записать оболочку оболочки SSH script, которая фактически равна ssh -F /path/to/your/config $*
  • Подготовьте GIT_SSH=/path/to/your/wrapper перед вашей обычной командой Git. Здесь git remote (origin) должен использовать формат [email protected]:user/project.git.

Ответ 17

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

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

Ваши учетные данные будут сохранены в течение 3600 секунд.

Ответ 18

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

Если вы используете двухфакторную аутентификацию, то указание имени пользователя и пароля даже не будет работать - вы получите отказ в доступе. Но вы можете использовать токен доступа к приложениям и использовать Git помощник учетных данных для кэширования для вас. Вот ссылки:

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

Ответ 19

Обычно у вас есть удаленный URL, что-то вроде этого,

git remote -v

origin    https://gitlab.com/username/Repo.git (fetch)
origin    https://gitlab.com/username/Repo.git (push)

Если вы хотите пропустить имя пользователя и пароль при использовании git push, попробуйте это:

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

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

ПРИМЕЧАНИЕ. Не работает, если имя пользователя является идентификатором электронной почты.

git remote -v

origin    https://username:[email protected]/username/Repo.git (fetch)
origin    https://username:[email protected]/username/Repo.git (push)

Ответ 20

Получил ответ от gitcredentials (7) Страница руководства. В моем случае у меня нет кеша учетных данных в моей установке Windows; Я использую хранилище учетных данных.

После использования хранилища учетных данных имя пользователя/пароль хранятся в файле [user folder]/. git-credentials. Чтобы удалить имя пользователя/пароль, просто удалите содержимое файла.

Ответ 21

Это работает для меня. Я использую Windows 10

git config --global credential.helper wincred

Ответ 22

Документация композитора упоминает, что вы можете помешать ей использовать API GitHub, чтобы он действовал как git clone:

Если вы установите ключ no-api в true в репозитории GitHub, он будет клонировать репозиторий, как и в любом другом репозитории Git, вместо использования API GitHub. Но в отличие от использования драйвера git, композитор все равно попытается использовать zip файлы GitHub.

Итак, раздел будет выглядеть так:

"repositories": [
    {
        "type": "vcs",
        "no-api": true,
        "url": "https://github.com/your/repo"
    }
],

Имейте в виду, что API существует по какой-то причине. Таким образом, это должно быть методом последней инстанции относительно увеличения нагрузки на github.com.

Ответ 23

Вы также редактируете файл bashrc и добавляете в него скрипт.

Это будет запрашивать ваш пароль один раз при запуске Git, а затем запоминает его до тех пор, пока вы не выйдете из системы.

SSH_ENV=$HOME/.ssh/environment
  
# 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

Ответ 24

  • Если у вас уже есть проекты:

    • перейдите к your/project/path/.git/config. Открой это. И измените URL-адреса, как url = https://[email protected]/project.git, чтобы: url = https://username:[email protected]/project.git
    • Или просто запустите эти команды в качестве своего проекта:
      git remote rm origin
      git remote add origin https://username:[email protected]/project.git
  • Если вы клонируете новый проект:
    git clone https://username:[email protected]/project.git

  • Подключение к существующему репозиторию:
    git remote add origin https://username:[email protected]/project.git