Недавно я переключился на синхронизацию своих репозиториев с https://на GitHub (из-за проблем с брандмауэром), и он каждый раз запрашивает пароль.
Есть ли способ кэшировать учетные данные вместо аутентификации каждый раз, когда git push
?
Недавно я переключился на синхронизацию своих репозиториев с https://на GitHub (из-за проблем с брандмауэром), и он каждый раз запрашивает пароль.
Есть ли способ кэшировать учетные данные вместо аутентификации каждый раз, когда git push
?
Начиная с 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 эта более безопасная опция недоступна, и вам потребуется изменить 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
, что, очевидно, нежелательно.
Альтернативный подход заключается в том, чтобы поместить ваше имя пользователя и пароль в файл ~/.netrc
, хотя, как и в случае с сохранением пароля в удаленном URL-адресе, это означает, что ваш пароль будет храниться на диске в виде простого текста и, следовательно, будет менее безопасным и не рекомендуется. Однако, если вы хотите использовать этот подход, добавьте следующую строку в ваш ~/.netrc
:
machine <hostname> login <username> password <password>
... заменив <hostname>
сервера, а <username>
и <password>
своим именем пользователя и паролем. Также не забудьте установить ограничительные разрешения файловой системы для этого файла:
chmod 600 ~/.netrc
Обратите внимание, что в Windows этот файл должен называться _netrc
, и вам может потребоваться определить переменную среды% HOME% - для получения дополнительной информации см.:
У вас также может быть 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
Сохранение пароля для 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:
(В дистрибутиве 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/логинов/паролей в одном файле и хранить их на своем диске в зашифрованном виде.
Я нахожу это более удобным, чем "помощник по кэшированию", где вам нужно запомнить и ввести (один раз за сеанс) разные пароли для каждой из ваших удаленных служб, чтобы указанный пароль был кэширован в памяти.
Там простой, старомодный способ хранения учетных данных пользователя в URL-адресе HTTPS:
https://user:[email protected]/...
Вы можете изменить URL с помощью git remote set-url <remote-repo> <URL>
Очевидным недостатком этого подхода является то, что вы должны хранить пароль в виде обычного текста. Вы все равно можете просто ввести имя пользователя (https://[email protected]/...
), которое, по крайней мере, избавит вас от хлопот.
Вы можете переключиться на SSH или использовать клиентское программное обеспечение GitHub.
Используйте хранилище учетных данных.
Для Git 2. 11+ в OS X и Linux используйте встроенный в Git хранилище учетных данных:
git config --global credential.helper libsecret
Для msysgit 1.7. 9+ в Windows:
git config --global credential.helper wincred
Для Git 1.7. 9+ на OS X используйте:
git config --global credential.helper osxkeychain
Вы можете просто использовать
git config credential.helper store
Когда вы в следующий раз введете пароль с помощью команды pull или push, он будет сохранен в файле .git-credentials в виде простого текста (немного небезопасно, но просто поместите его в защищенную папку).
И это, как указано на этой странице:
Для меня не сразу было очевидно, что мне нужно сначала скачать помощника! Я нашел загрузку 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
Просто включите регистрационные данные как часть URL:
git remote rm origin
git remote add origin https://username:[email protected]/path/to/repo.git
Примечание: я не рекомендую этот метод, но если вы в спешке и больше ничего не работает, вы можете использовать этот метод.
В настройках GNU/Linux, ~/.netrc работает также хорошо:
$ cat ~/.netrc
machine github.com login lot105 password howsyafather
Это может зависеть от того, какие сетевые библиотеки Git используется для транспорта HTTPS.
Для 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
при аутентификации на любом сервере.
Если вы не хотите хранить свой пароль в незашифрованном виде, как сказал Марк, вы можете использовать другой URL-адрес GitHub для извлечения, чем для отправки. В вашем конфигурационном файле в разделе [remote "origin"]
:
url = git://github.com/you/projectName.git
pushurl = [email protected]:you/projectName.git
Он по-прежнему будет запрашивать пароль при нажатии, но не при извлечении, по крайней мере, для проектов с открытым исходным кодом.
Вы можете создать свой собственный персональный 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.
git config --global credential.helper osxkeychain
(osxkeychain helper
),git config --global credential.helper wincred
git config --global credential.helper cache
Связанные с:
Вы можете использовать помощники учетных данных.
git config --global credential.helper 'cache --timeout=x'
где x
- количество секунд.
После клонирования репозитория repo
, вы можете редактировать repo/.git/config
и добавить некоторую конфигурацию, как показано ниже:
[user]
name = you_name
password = you_password
[credential]
helper = store
Тогда вас больше не попросят ввести username
и password
.
Я знаю, что это не безопасное решение, но иногда вам нужно просто простое решение - без установки чего-либо еще. И поскольку 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 будет использовать этот пользователь + пароль.
Вместо пароля учетной записи следует использовать токен аутентификации. Перейдите в настройки/приложения GitHub, а затем создайте токен доступа. Маркер может использоваться так же, как и пароль.
Маркер предназначен для того, чтобы пользователи не могли использовать пароль учетной записи для работы над проектом. Используйте только пароль при выполнении администрирования, например, создание новых токенов или отмену старых токенов.
Вместо маркера или пароля, который предоставляет пользователю полный доступ к учетной записи GitHub, для предоставления доступа к одному репозиторию проекта может использоваться специальный ключ развертывания проекта. Проект Git может быть настроен для использования этого другого ключа в следующих шагах, когда вы по-прежнему можете обращаться к другим учетным записям или проектам Git с вашими нормальными учетными данными:
Host
, IdentityFile
для ключа развертывания, возможно, UserKnownHostsFile
и, возможно, User
(хотя я думаю, что вам это не нужно).ssh -F /path/to/your/config $*
GIT_SSH=/path/to/your/wrapper
перед вашей обычной командой Git. Здесь git remote
(origin) должен использовать формат [email protected]:user/project.git
.Для безопасности лучше использовать учетные данные, но вы можете сохранить их в течение некоторого времени, используя кеш:
git config --global credential.helper cache
git config credential.helper 'cache --timeout=3600'
Ваши учетные данные будут сохранены в течение 3600 секунд.
Все немного отличается, если вы используете двухфакторную аутентификацию, как и я. Поскольку я не нашел хорошего ответа в другом месте, я буду придерживаться его здесь, чтобы, возможно, я смогу найти его позже.
Если вы используете двухфакторную аутентификацию, то указание имени пользователя и пароля даже не будет работать - вы получите отказ в доступе. Но вы можете использовать токен доступа к приложениям и использовать Git помощник учетных данных для кэширования для вас. Вот ссылки:
И я не помню, где я это видел, но когда вас попросят указать ваше имя пользователя - там, где вы прикрепляете токен доступа к приложениям. Затем оставьте пароль пустым. Он работал на моем Mac.
Обычно у вас есть удаленный 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)
Получил ответ от gitcredentials (7) Страница руководства. В моем случае у меня нет кеша учетных данных в моей установке Windows; Я использую хранилище учетных данных.
После использования хранилища учетных данных имя пользователя/пароль хранятся в файле [user folder]/. git-credentials. Чтобы удалить имя пользователя/пароль, просто удалите содержимое файла.
Это работает для меня. Я использую Windows 10
git config --global credential.helper wincred
Документация композитора упоминает, что вы можете помешать ей использовать 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.
Вы также редактируете файл 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
Если у вас уже есть проекты:
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