在GitHub上使用https://时有没有办法跳过密码输入?

Zep*_*ock 1806 git authentication github git-push git-config

我最近切换到将我的存储库同步到GitHub上的https://(由于防火墙问题),并且每次都要求输入密码.过去,我有一个SSH证书,这就足够了.在我的情况下是否有办法绕过密码(使用http/https)?

Mar*_*air 2319

使用Git 1.7.9及更高版本

自Git 1.7.9(2012年1月下旬发布)以来,Git中有一个简洁的机制,可以避免一直为HTTP/HTTPS输入密码,称为凭证助手.(感谢dazonic在下面的评论中指出这个新功能.)

使用Git 1.7.9或更高版本,您可以使用以下凭证助手之一:

git config --global credential.helper cache
Run Code Online (Sandbox Code Playgroud)

...告诉Git将密码缓存在内存中(默认情况下)为15分钟.您可以设置更长的超时:

git config --global credential.helper "cache --timeout=3600"
Run Code Online (Sandbox Code Playgroud)

(该示例在LinuxGitHub帮助页面中提供.)如果需要,您还可以永久存储您的凭据,请参阅下面的其他答案.

GitHub的帮助还表明,如果您使用的是Mac OS X并使用Homebrew来安装Git,您可以使用本机Mac OS X密钥库:

git config --global credential.helper osxkeychain
Run Code Online (Sandbox Code Playgroud)

对于Windows,有一个名为Git Credential Manager for Windowswincred在msysgit中的助手.

git config --global credential.helper wincred # obsolete
Run Code Online (Sandbox Code Playgroud)

使用Git for Windows 2.7.3+(2016年3月):

git config --global credential.helper manager
Run Code Online (Sandbox Code Playgroud)

对于Linux,您可以使用gnome-keyring(或其他密钥环实现,如KWallet).

使用1.7.9之前的Git版本

对于1.7.9之前的Git版本,这个更安全的选项不可用,您需要更改origin远程用来包含密码的URL :

https://you:password@github.com/you/example.git
Run Code Online (Sandbox Code Playgroud)

...换句话说,:password在用户名之后和之前@.

您可以使用以下命令为origin远程设置新URL :

git config remote.origin.url https://you:password@github.com/you/example.git
Run Code Online (Sandbox Code Playgroud)

确保您使用https,并且您应该知道,如果您这样做,您的GitHub密码将以纯文本形式存储在您的.git目录中,这显然是不可取的.

任何Git版本(好吧,自版本0.99)

另一种方法是将您的用户名和密码放在您的~/.netrc文件中,但是,与将密码保存在远程URL中一样,这意味着您的密码将以纯文本形式存储在磁盘上,因此安全性较低,不建议使用.但是,如果您想采用这种方法,请将以下行添加到您的~/.netrc:

machine <hostname> login <username> password <password>
Run Code Online (Sandbox Code Playgroud)

...替换<hostname>服务器的主机名,<username><password>使用您的用户名和密码.还记得在该文件上设置限制性文件系统权限:

chmod 600 ~/.netrc
Run Code Online (Sandbox Code Playgroud)

请注意,在Windows上,应调用此文件_netrc,您可能需要定义%HOME%环境变量 - 有关更多详细信息,请参阅:

  • 不要以纯文本格式存储密码.从Git 1.7.9开始,您可以使用凭证助手.OS X上的`git config --global credential.helper osxkeychain`.对于其他操作系统,请参阅https://help.github.com/articles/set-up-git (70认同)
  • `git config --global credential.helper cache`在Windows上不起作用:http://stackoverflow.com/questions/11693074/git-credential-cache-is-not-a-git-command use [gitcredentialstore]( http://gitcredentialstore.codeplex.com/)在Windows上很开心 (10认同)
  • 有什么方法可以将此超时设置为无穷大? (8认同)
  • FWIW,osx钥匙串的东西是基本GIT源代码的一部分,它不是Brew或MacPorts的独家组件,也不是本月的味道.而你甚至不需要从头开始构建git - 只需cd contrib/credential/osxkeychain /并运行make. (5认同)
  • 使用双因素身份验证时,您必须使用github所称的[人员访问令牌](https://help.github.com/articles/creating-an-access-token-for-command-line-use).实际上你应该总是使用一个,因为与密码不同,你可以控制它给出的访问权限.只需更换网址中的密码,即可获得"https://用户名:PERSONAL_ACCESS_TOKEN @ github.com/username/project.git`.它使存储在磁盘上的纯文本密码几乎足够安全. (2认同)
  • 也许你可以尝试一个非常大的数字,如999999999 (2认同)
  • @Triynko这就是为什么你**不要在命令行上输入密码.任何处理密码的合适的命令行工具要么_enes not_不要在命令行上使用它们,要么**强烈地阻止它.始终建议以交互方式提供凭据.你运行命令,它会提示"密码:",没有其他进程看到你输入的内容.任何在shell命令行中使用密码的人都应该得到他们得到的东西.(当命令运行时,也显示在`ps`中.)但是,我们这些在看到命令提示时不会惊慌失措的人在20世纪90年代就学到了这一点. (2认同)

小智 703

您还可以让Git使用以下内容永久存储您的凭据:

git config credential.helper store
Run Code Online (Sandbox Code Playgroud)

注意:虽然这很方便,但Git会将您的凭据以明文形式存储在项目目录下的本地文件(.git-credentials)中(请参阅下面的"home"目录).如果您不喜欢这样,请删除此文件并切换到使用缓存选项.

如果您希望Git每次需要连接到远程存储库时继续询问您的凭据,您可以运行以下命令:

git config --unset credential.helper
Run Code Online (Sandbox Code Playgroud)

要将密码存储.git-credentials%HOME%目录中而不是项目目录中:使用--global标志

git config --global credential.helper store
Run Code Online (Sandbox Code Playgroud)

  • 我发现我必须指定--global或它会尝试将设置存储在当前存储库中:`git config --global credential.helper store` (73认同)
  • 在Windows上,您可以下载帮助程序实用程序,在Windows Creditial Store中配置存储加密版GIT密码的内容,请参阅https://confluence.atlassian.com/display/STASH/Permanently+authenticating+with+Git+repositories (7认同)
  • 为什么要进行缓存而不是永久存储?共享电脑什么的? (6认同)
  • @BrianGordon我在Windows上使用GIT 1.9.5,而`--global`标志是多余的.即使没有此标志,凭证文件也是在`%USER_HOME%`目录中创建的. (2认同)
  • 如果不以纯文本形式存储,它受到什么保护?你的密码?当你连接到git时,它不会要求你输入管理员密码吗?是不是必须输入密码才能获得另一个有点奇怪的密码? (2认同)
  • 跟进@osirisgothra 回答:只需设置一个很长的超时时间。`git config --global credential.helper "cache --timeout=9999999999"`。这对我有用,是 317 年。 (2认同)

Von*_*onC 96

TLDR; 使用带有Git 1.8.3+加密netrc文件.

保存Git存储库的密码在Windows上使用~/.netrc(Unix)或%HOME%/_netrc(注意_)可以使用HTTPS URL .

但是:该文件将以纯文本格式存储您的密码.

解决方案:使用GPG(GNU Privacy Guard)加密该文件,并在每次需要密码(用于push/ pull/ fetch/ clone操作)时让Git对其进行解密.


注意:使用Git 2.18(2018年第二季度),您现在可以自定义用于解密加密.netrc文件的GPG .

Luis Marsano的提交786ef50,提交f07eeed(2018年5月12日)(``).
(由Junio C gitsterHamano合并- -提交017b7c5,2018年5月30日)

git-credential-netrc:接受gpg选项

git-credential-netrcgpg无论gpg.program选项如何,都被硬编码为' ' 解密.
这是像Debian这样的分布上的一个问题,它将现代GnuPG称为其他东西,比如' gpg2'


Windows的分步说明

使用Windows:

(Git gpg.exe在其发行版中有一个,但使用完整的GPG安装包括一个gpg-agent.exe,它会记住与你的GPG密钥相关的密码.)

(注意' copy'命令:Git将需要一个Bash脚本来执行命令' gpg'.自gpg4win-vanilla-2提供以来gpg2.exe,你需要复制它.)

(确保将密码加到该密钥上.)

(是的,这是一个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
    
    Run Code Online (Sandbox Code Playgroud)

(不要忘记' protocol'部分:' http'或' https'取决于您将使用的URL.)

(您现在可以删除_netrc文件,仅保留_netrc.gpg加密文件.)

(注意' /':C:\path\to...根本不起作用.)(你可以先用它-v -d来看看发生了什么.)

从现在开始,任何使用需要身份验证的HTTP(S)URL的Git命令都将解密该_netrc.gpg文件并使用与您联系的服务器关联的登录名/密码.第一次,GPG会要求您提供GPG密钥的密码,以解密该文件.其他时候,第一次GPG呼叫自动启动的gpg-agent 将为您提供该密码.

这样,您可以在一个文件中记住多个 URL /登录/密码,并将其存储在磁盘上加密.
我发现它比"缓存"助手更方便",你需要记住并为每个远程服务键入(每个会话一次)一个不同的密码,以便将所述密码缓存在内存中.

  • @sunny这就是`curl -oc:\ prgs\bin\git-credential-netrc https:// raw.github.com/git/git/master/contrib/credential/netrc/git-credential-netrc` for:你需要在路径中的任何地方复制`git-credential-netrc`(`$ PATH`),以便git能够调用'`credential-netrc`'. (4认同)

roo*_*oo2 41

使用凭证存储.

对于OS XLinux上的Git 2.11+ ,使用Git内置的凭证存储:

git config --global credential.helper libsecret
Run Code Online (Sandbox Code Playgroud)

对于Windows上的msysgit 1.7.9+ :

git config --global credential.helper wincred
Run Code Online (Sandbox Code Playgroud)

对于OS X上的Git 1.7.9+使用:

git config --global credential.helper osxkeychain
Run Code Online (Sandbox Code Playgroud)

  • credential-libsecret'不是git命令 (4认同)
  • __安全问题:__ Windows 凭据管理器使登录到您的 Windows 帐户的任何人都可以访问您的纯文本密码。他们需要做的就是向凭证管理器发送一个请求,例如`printf "protocol=https\nhost=git.mycompany.com\n" | git credential-manager get`([更多细节在这里](https://github.com/0cjs/sedoc/blob/master/git/win.md#credential-management))。您应该始终使用 [个人访问令牌](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/),当然还要使用 2FA在您的 GitHub 帐户上。 (3认同)
  • 我确信这是要走的路,但我遗憾地得到一个错误:`git:'credential-gnome-keyring'不是git命令.见'git --help' (2认同)
  • 在 libsecret 在 Linux 上工作之前,您需要执行以下步骤:http://stackoverflow.com/a/40312117/775800 (2认同)

wor*_*art 40

有一种简单,老式的方法可以在HTTPS URL中存储用户凭据:

https://user:password@github.com/...
Run Code Online (Sandbox Code Playgroud)

您可以使用更改URL git remote set-url <remote-repo> <URL>

这种方法的明显缺点是您必须以纯文本格式存储密码.您仍然可以输入用户名(https://user@github.com/...),这至少可以节省一半的麻烦.

您可能更喜欢切换到SSH或使用GitHub客户端软件.

  • 可能需要对用户名/密码进行编码,请参阅 /sf/answers/2422791801/ (2认同)

小智 39

你可以使用

git config credential.helper store
Run Code Online (Sandbox Code Playgroud)

当您下次使用pull或push输入密码时,它将以.git-credentials格式存储为纯文本(有点不安全,但只是将其放入受保护的文件夹)

就是这样,如本页所述:

https://git-scm.com/docs/git-credential-store

  • 对于Git for Windows 2.7.3(2016年3月):https://github.com/git-for-windows/git/releases?after = v2.8.4.windows.1,那将是`git config credential.helper manager `而不是 (3认同)

Ben*_*Ben 22

对我来说,我不需要首先下载帮助程序!我在Atlassian使用Git存储库进行永久性身份验证时发现了credential.helper下载.

引用:

如果要在OS X上使用带有凭据缓存的Git,请执行以下步骤:

下载二进制git-credential-osxkeychain.

运行以下命令以确保二进制文件是可执行的:

chmod a+x git-credential-osxkeychain
Run Code Online (Sandbox Code Playgroud)

把它放在目录中/usr/local/bin.

运行以下命令:

git config --global credential.helper osxkeychain
Run Code Online (Sandbox Code Playgroud)


Tar*_*pta 22

只需将登录凭据作为URL的一部分包含在内:

git remote rm origin
git remote add origin https://username:mypassword@github.com/path/to/repo.git
Run Code Online (Sandbox Code Playgroud)

注意:我不推荐这种方法,但是如果你匆忙而没有其他工作,你可以使用这种方法

  • 它将起作用你必须在你的电子邮件ID中逃脱@%40 (11认同)
  • 有%2B而不是+ (4认同)
  • 如果用户名是电子邮件,则不起作用 (2认同)

hel*_*ers 19

在GNU/Linux设置上,〜/ .netrc也能很好地工作:

$ cat ~/.netrc
machine github.com login lot105 password howsyafather
Run Code Online (Sandbox Code Playgroud)

它可能取决于Git用于HTTPS传输的网络库.

  • 一定要'chmod 0600~/.netrc`. (4认同)

Nad*_*edr 16

对于Windows,您可以使用Git Credential Manager(GCM)插件.它目前由Microsoft维护.好处是它将密码保存在Windows凭据存储中,而不是纯文本.

项目的发布页面上有一个安装程序.这也将安装官方版本的Git for Windows,内置凭证管理器.它允许对GitHub(和其他服务器)进行双因素身份验证.并具有用于初始登录的图形界面.

对于Cygwin用户(或已经使用官方Git for Windows的用户),您可能更喜欢手动安装.从发布页面下载zip包.解压缩包,然后运行该install.cmd文件.这将安装到您的~/bin文件夹中.(确保您的~/bin目录位于PATH中.)然后使用以下命令对其进行配置:

git config --global credential.helper manager
Run Code Online (Sandbox Code Playgroud)

然后Git将git-credential-manager.exe在对任何服务器进行身份验证时运行.

  • 登录到您帐户的任何人都可以轻松访问密码的明文。他们所需要做的就是向凭证管理器发送一个请求,例如`printf“ protocol = https \ nhost = git.mycompany.com \ n” | git credential-manager get`([[更多详细信息在这里](https://github.com/0cjs/sedoc/blob/master/git/win.md#credential-management))。您应该始终与此一起使用[个人访问令牌](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/),并且当然要使用2FA在您的GitHub帐户上。 (2认同)

Mat*_*rog 12

如果您不想像Mark所说的那样以明文形式存储密码,那么您可以使用不同的GitHub URL进行提取,而不是使用推送.在配置文件中,位于[remote "origin"]:

url = git://github.com/you/projectName.git
pushurl = git@github.com:you/projectName.git
Run Code Online (Sandbox Code Playgroud)

当你推送时它仍然会要求输入密码,但是至少对于开源项目来说,它不会在你获取时提出.


ken*_*orb 11

OAuth的

您可以创建自己的个人API令牌(OAuth),并以与使用普通凭据相同的方式使用它(在:)/settings/tokens.例如:

git remote add fork https://4UTHT0KEN@github.com/foo/bar
git push fork
Run Code Online (Sandbox Code Playgroud)

.netrc

另一种方法是在~/.netrc(_netrc在Windows上)配置您的用户/密码,例如

machine github.com
login USERNAME
password PASSWORD
Run Code Online (Sandbox Code Playgroud)

对于HTTPS,请添加额外的行:

protocol https
Run Code Online (Sandbox Code Playgroud)

凭证助手

要在使用HTTPS时在Git中缓存GitHub密码,您可以使用凭证帮助程序告诉Git每次与GitHub交谈时都要记住您的GitHub用户名和密码.

  • 苹果:git config --global credential.helper osxkeychain(osxkeychain helper需要)
  • 视窗: git config --global credential.helper wincred
  • Linux等: git config --global credential.helper cache

有关:


Cha*_*ran 9

您可以使用凭证助手.

git config --global credential.helper 'cache --timeout=x'
Run Code Online (Sandbox Code Playgroud)

x秒数在哪里.

  • 它是秒数...一些天才将其更新为毫秒,并且每个人都批准它而不进行检查.如果你不知道答案,请不要误导人.谢谢! (7认同)
  • 需要注意的是,除非你先调用另一个特定的命令将'cache'用作管理器,否则这会出现问题.这些东西是如此神秘,所有这些答案都是不完整的,而且都没有.令人难以置信的沮丧.请改为使用:/sf/answers/1736060931/ (2认同)

Xia*_*iao 8

克隆后repo,您可以编辑repo/.git/config并添加如下配置:

[user]
    name = you_name
    password = you_password
[credential]
    helper = store
Run Code Online (Sandbox Code Playgroud)

然后,你将不会被要求usernamepassword试.


beb*_*bbo 7

我知道这不是一个安全的解决方案,但有时你只需要一个简单的解决方案 - 无需安装任何其他东西.由于helper = store对我不起作用,我创建了一个虚拟助手:

创建一个脚本并将其放入您的用户bin文件夹,此处名为credfake,此脚本将提供您的用户名和密码:

#!/bin/bash
while read line
do
  echo "$line"
done < "/dev/stdin"
echo username=mahuser
echo password=MahSecret12345
Run Code Online (Sandbox Code Playgroud)

让它可执行:

chmod u+x /home/mahuser/bin/credfake
Run Code Online (Sandbox Code Playgroud)

然后在git中配置它:

git config --global credential.helper /home/mahuser/bin/credfake
Run Code Online (Sandbox Code Playgroud)

(或仅使用--global用于一个回购)

并且 - voilá - git将使用此用户+密码.


min*_*hua 6

应使用身份验证令牌而不是帐户密码.转到GitHub设置/应用程序,然后创建个人访问令牌.令牌的使用方式与使用密码的方式相同.

该令牌旨在允许用户不使用帐户密码进行项目工作.仅在执行管理工作时使用密码,例如创建新令牌或撤消旧令牌.


可以使用项目特定部署密钥来授予对单个项目存储库的访问权限,而不是授予用户对GitHub帐户的整体访问权限的令牌或密码.当您仍然可以使用普通凭据访问其他Git帐户或项目时,可以将Git项目配置为在以下步骤中使用此不同的密钥:

  1. 编写一个包含一个SSH的配置文件Host,IdentityFile为部署关键,也许是UserKnownHostsFile,也许User(虽然我认为你不需要它).
  2. 编写一个实际上是SSH包装器shell脚本 ssh -F /path/to/your/config $*
  3. 前置GIT_SSH=/path/to/your/wrapper在普通的Git命令的前面.这里git remote(原点)必须使用git@github.com:user/project.git格式.


Sar*_*oev 6

最好使用凭据进行安全性,但您可以使用缓存保留一段时间:

git config --global credential.helper cache
git config credential.helper 'cache --timeout=3600'
Run Code Online (Sandbox Code Playgroud)

您的凭据将保存3600秒.


Nay*_*gam 6

通常你有一个远程 URL,像这样,

git remote -v

origin    https://gitlab.com/username/Repo.git (fetch)
origin    https://gitlab.com/username/Repo.git (push)
Run Code Online (Sandbox Code Playgroud)

如果你想在使用时跳过用户名和密码git push,试试这个:

 git remote set-url origin https://username:password@gitlab.com/username/Repo.git
Run Code Online (Sandbox Code Playgroud)

我刚刚向 origin 添加了相同的 URL(包含用户详细信息,包括密码)。

注意:如果用户名是电子邮件 ID,则不起作用。

git remote -v

origin    https://username:password@gitlab.com/username/Repo.git (fetch)
origin    https://username:password@gitlab.com/username/Repo.git (push)
Run Code Online (Sandbox Code Playgroud)


JnB*_*ymn 5

如果您像我一样使用双因素身份验证,情况会有所不同.由于我在其他地方找不到好的答案,我会在这里贴一个,以便我以后可以找到它.

如果您使用的是双因素身份验证,则指定用户名/密码甚至无法正常工作 - 您将获得拒绝访问权限.但是您可以使用应用程序访问令牌并使用Gi​​t的凭据帮助程序为您缓存该令牌.以下是相关链接:

我不记得我在哪里看到这个,但当你被问到你的用户名时 - 那就是你坚持使用应用程序访问令牌的地方.然后将密码留空.它适用于我的Mac.


归档时间:

查看次数:

944265 次

最近记录:

6 年,2 月 前