Git不断提示我输入密码


665

我已经使用Git一段时间了,但是不断要求输入密码的人开始把我推向高潮。

我使用的是Mac OS X和GitHub,并按照GitHub的“ 设置Git”页面的说明设置了Git和SSH密钥。

GitHub的SSH密钥密码页面所述,我还向我的Mac OS X钥匙串添加了github SSH密钥。我的公钥已在Git中注册。

不过,每次我尝试Git拉时,都必须输入用户名和密码。我需要为此设置除SSH密钥以外的其他东西吗?


1
愚蠢的问题,但是您是否仅通过git对机器使用ssh即可验证SSH密钥是否有效?
Kurt Stutsman

4
您是说类似ssh -T git@github.com吗?是的,这很好(如果有点慢)。
凯瑟琳


对于https网址,您可以使用git凭据助手' netrc' (与git1.8.3 +一起使用)。在这里查看完整示例
VonC

我是Windows用户,即使将公共密钥添加到服务器的authorized_keys文件中,我也面临密码请求问题。真正的问题是我没有将公用/专用密钥保留在c:\ program files \ git文件夹的.ssh文件夹下。如果有人遇到此类问题,请将您的钥匙复制到此文件夹中,然后尝试推/拉。
Raja Amer Khan

Answers:


797

我认为您可能使用了错误的Git存储库URL。

打开.git/config并找到[远程“来源”]部分。确保您使用的是SSH:

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

如果单击克隆或下载并选择ssh,则可以在存储库的主页中看到SSH URL 。

而不是httpsgit一个:

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

现在,您可以使用SSH密钥而不是用户名和密码进行验证。

如果Git的抱怨'origin' has already been added,打开.config的文件和编辑的url = "..."部分后[remote origin]url = ssh://github/username/repo.git


其他服务也是如此。确保地址看起来像:protocol://something@url

例如.git/configAzure DevOps:

[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

4
可能就是这样。当我打电话混帐远程-v我得到:起源 github.com/Foo/Bar.git(取)产地 github.com/Foo/Bar.git(推),而与SSH的工作似乎应该是:出身的git @ github.com:Foo / Bar.git(获取)git@github.com:Foo / Bar.git(推送)这可能是因为我最初是使用GitHub的Mac应用程序(mac.github.com)签出项目的。知道我该如何解决吗?
凯瑟琳

8
修复.git / config文件中的URL,使用git-remote对其进行修复,或者删除您的本地存储库,然后使用正确的URL再次克隆它。
static_rtti

91
只是要说明一下(按我的需要):打开.git / config并在[remote "origin"]set区域中url = ssh://git@github.com/username/Repo.git。那对我有用。
Greg K

13
奇怪的是,@ GregK的解决方案对我不起作用,但url = git@github.com:organization/Repo.git确实起作用。+1可引导我走上正确的道路!成功!
jmort253

3
我不太强调使用ssh:// git @ github / [username] / [reponame]对CLONE的重要性。git是否要使用密钥来访问GIT,而不必每次都键入用户名和密码。我发现解决此问题的唯一方法是删除本地存储库并再次克隆$ git clone ssh:// git @ github / [用户名] / [reponame] .git
Gene Myers

555

配置credential.helper

在OS X(现在为macOS)上,在 Terminal中

git config --global credential.helper osxkeychain

它使Git可以使用文件Keychain.app来存储用户名和密码,并从钥匙串中检索通向您的SSH私钥的密码。

对于Windows使用:

git config --global credential.helper wincred

故障排除

如果正确配置了Git凭证帮助器,则macOS会将密码短语保存在钥匙串中。有时SSH和存储在钥匙串中的密码短语之间连接可能会断开。跑ssh-add -Kssh-add ~/.ssh/id_rsa再次或将密钥添加到钥匙串。

macOS v10.12(Sierra)更改为ssh

对于macOS v10.12(Sierra),ssh-add -K需要在每次重新引导后运行。为避免这种情况,请~/.ssh/config使用此内容进行创建。

Host *
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/id_rsa

ssh_config man10.12.2 的页面上:

UseKeychain

在macOS上,指定在尝试使用特定密钥时系统是否应在用户的密钥链中搜索密码短语。当用户提供密码短语时,此选项还指定一旦被验证正确,是否应将密码短语存储在钥匙串中。参数必须为“是”或“否”。默认为“否”。

苹果增加了Technote 2449,它解释了发生了什么。

在macOS Sierra之前,ssh将出现一个对话框,询问您的密码短语,并提供将其存储到钥匙串中的选项。此用户界面在一段时间前已过时,已被删除。


30
到目前为止,这是执行此操作的最佳方法,因为默认情况下,OSX的Github应用程序(也许还有Windows)使用git仓库的https路径。还有一个很好的理由使用https而不是ssh / git,因为出于安全原因,许多公司网络仅允许端口80443上的流量。
codehugger 2012年

2
您需要git 1.7.10或更高版本才能使用凭据帮助器。
jbandi 2012年

3
+1 for keychain.app解决方案。这是伟大的我,因为我的雇主的git的服务器仅支持HTTP通过Apache提供服务,他们使用极力劝阻.netrc这使你的密码以明文文件的方法。
2013年

3
请注意,'credential-osxkeychain' is not a git command.由于没有安装凭据助手,因此出现了错误。我按照此处的说明进行安装:help.github.com/articles/set-up-git#password-caching

2
感谢您对Sierra的更新,我刚刚进行了更新,无法弄清楚为什么在我git config --global credential.helper osxkeychain.ssh目录中添加config文件时github一直要求pw的问题。
像素

139

当我升级到macOS v10.12(Sierra)时,这发生在我身上。看起来SSH代理已在升级时清除。

$ ssh-add -L
The agent has no identities.

只需运行即可ssh-add找到我现有的身份。我输入了密码,很高兴再次进入。


9
+1被Sierra升级破坏了。请注意,密码是SSH密钥的密码,而不是Mac用户的密码。
mbonness

1
进行ssh-add确实可以,但是似乎可以通过关闭“终端”窗口来重置。也许这是一个新的“功能”。
joshd

请注意-另一个Sierra更新(10.12.2)再次发生了这种情况,但是应用了相同的修复程序。
布赖恩

有人知道关闭终端后如何不重置吗?
nickjwallin

1
我刚刚将Macbook Pro更新到10.12.2,它破坏了我的git。使用ssh-add完全适合我。谢谢@amcc!
jimmyplaysdrums

68

使用此方法:用适当的主机名替换github.com

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

查看时我已经设置好了git remote -v。但是,仍然提示我输入密码。
IgorGanapolsky

相同,我已经按照他的建议进行了设置,但是仍然提示输入密码,如何防止这种情况发生?
cyber8200

@IgorGanapolsky:您是否找到适合您的解决方案?
cyber8200

1
这可以正常工作。奇怪的是,带有的远程URL git@**不会提示凭据,而带有的URL 会提示https@**:)。因此我找到了这个文件
Sujit Kumar Singh,

54

正如其他人所说,您可以安装密码缓存帮助器。我主要只是想发布其他平台的链接,而不仅仅是Mac。我正在运行Linux服务器,这对有所帮助:在Git中缓存GitHub密码

对于Mac:

git credential-osxkeychain

视窗:

git config --global credential.helper wincred

Linux:

git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

5
我必须向下滚动到第三个答案才能看到Linux指令,这些应该位于主要答案中,因为这是一个普遍引用的问题。
KoldBane's

22

还要查找谁在询问您密码。是Git还是您的SSH代理?

就我而言,每次我做的git pull都是问我:

Enter passphrase for key '/work/username/.ssh/id_rsa':

所以我以为是Git要求输入密码。因此,我一直在寻找解决方案,直到后来才意识到我的SSH代理已关闭。可以使用修复eval $(ssh-agent),并ssh-add给出这里。

也粘贴在您可以添加到您的小片段的下面 ~/.bashrc文件(或等效文件)中,以确保登录时启动SSH代理。

无论如何,这是我犯的一个非常愚蠢的错误,但是将其发布在这里,以防它像我一样帮助某人从错误的树上节省一些时间。

# 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


相当确定您在上面的代码中缺少一行-根据stackoverflow.com/a/18915067/277023您需要拥有SSH_ENV="$HOME/.ssh/environment"
kellyfj

20
git config credential.helper store

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

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

git config --unset credential.helper

要将密码存储在%HOME%目录(而不是项目目录)中的.git-credentials中,请使用--global标志

git config --global credential.helper store

9

使用SSH推/拉的Windows和GitHub上的Git指南Windows上的Git图解指南

  1. 下载并安装PuTTY
  2. 设置环境变量'GIT_SSH'='path \ to \ plink.exe'(在已安装的腻子文件夹中)- 非常重要
  3. 重新启动Windows资源管理器以使环境变量生效(不能仅重新启动命令提示符)
  4. 运行puttygen.exe生成新密钥,将公共密钥复制到GitHub站点
  5. 将此新私钥保存在磁盘上的安全位置(最好不是Dropbox
  6. 运行putty.exe并将SSH连接到github.co
  7. 通过运行“ shell:startup”快速进入启动文件夹。
  8. 通过Pageant使Windows的私钥启动。在启动文件夹中使用语法“ path \ to \ pageant.exe”“ path \ to \ privatekey”创建快捷方式
  9. 我们不需要在存储库的.git / config中设置'puttykeyfile'设置
  10. 非常重要的是,使用的是GitHub的“ SSH克隆URL”,而不是HTTPS。

没有人应该再使用腻子了。您现在可以使用内置的Windows 10实用程序执行所有操作。让腻子,就是腻子。
伊恩·史密斯

9

在Windows for Git 1.7.9+中,在命令提示符下运行以下命令以在文本编辑器中打开配置文件:

    git config --global --edit

然后在文件中添加以下块(如果不存在)或相应地对其进行编辑:

    [credential "https://giturl.com"]
        username = <user id>
         helper = wincred

保存并关闭文件。完成上述更改后,您只需提供一次凭据即可。


这很完美,您节省了我的时间,现在我可以专注于我的工作,非常感谢兄弟。
Mohammed Sufian

9

使用以下命令来延长超时时间,以便您可以重新输入密码一段时间

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

我将其用于Bitbucket和GitHub,两者均适用。您唯一需要做的 3600就是几秒钟。将其增加到所需的程度。我将其更改259200为大约30天。这样,我每隔30天左右重新输入一次密码。


1
好的,我发现重新启动后这种情况不会持续,因此无论超时如何,您仍然需要在重新启动后输入密码...
Ben Winding

这是制作缓存的一种好方法:)至少节省了我的时间。谢谢
ChikuMiku

@BenWinding,因为它将凭据存储在内存中。
z3dd

5

我认为您已解决了您的问题,但是我看不到这里的解决方案对我有所帮助,所以就在这里。

输入终端:

echo "" > ~/.ssh/known_hosts

这将清空您的known_hosts文件,并且您必须添加您使用过并已连接的每个主机,但是它解决了问题。


1
cat /dev/null > ~/.ssh/known_hosts会做同样的。
Tin Man

5
> ~/.ssh/known_hosts甚至更短:)
Collin Allen'Oct

rm〜/ .ssh / known_hosts也应该做。我建议不要这样做。
orkoden

3
如果您需要从〜/ .ssh / known_hosts中删除主机,则没有比清除文件更有效的方法。〜/ .ssh / known_hosts只是一个文本文件,如果您可以在文件中找到有问题的主机,则只需删除它们的行即可。您可能需要在编辑之前备份文件。如果文件中只有几个条目,那么清除它可能不是一个坏主意。我在许多服务器上工作,所以〜/ .ssh / known_hosts中有数百个条目,但我还没有准备好全部删除它们以删除一些条目。
Tim Stewart

3
@papan这不会阻止git要求我输入密码!
IgorGanapolsky

5

从某种意义上讲,我觉得static_rtti提供的答案是不可靠的。我不知道这是否较早可用,但是Git工具现在提供了凭证存储。

缓存模式

$ git config --global credential.helper cache

使用“缓存”模式可以将凭据保留在内存中一段时间​​。密码从未存储在磁盘上,并且15分钟后会从缓存中清除。

储存模式

$ git config --global credential.helper 'store --file ~/.my-credentials'

使用“存储”模式将凭据保存到磁盘上的纯文本文件中,并且它们永远不会过期。

我个人使用商店模式。我删除了存储库,将其克隆,然后必须输入一次凭据。

参考:7.14 Git工具-凭证存储


对于Windows credential.helper cache不起作用。应该是git config --global credential.helper wincred
Paulo Merson19年

存储它可以正常工作,现在它使我可以一直进行更改而无需始终提示输入密码,您就是救命稻草!
g4ost

在Linux中,这为我完成了工作git config --local credential.helper store。就我而言,我使用的是HTTPS,这样一来,我只键入一次用户名/密码,之后,我的凭据就从〜/ .git-credentials中重新使用
CCarlos

3

orkoden关于在终端机上使用带有Git的钥匙串的答案不完整,并会引发错误。这是保存在钥匙串终端中输入的用户名和密码所需执行的操作:

curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain
sudo mv git-credential-osxkeychain /usr/local/bin
sudo chmod u+x /usr/local/bin/git-credential-osxkeychain

然后输入

git config --global credential.helper osxkeychain

如果您已经在curl之前完成了Git配置,那没问题;会的。


1
如果我在linux上怎么办。
IgorGanapolsky

3

正如static_rtti所述,更改

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

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

我自己https将.git / config文件中的更改为ssh,但仍然无法正常工作。然后我看到您必须更改github.comgit@github.com。获取实际正确URL的一种好方法是转到您的项目页面,然后单击以下命令:

将HTTPS更改为SSH以获取正确的URL

然后将此URL添加到配置文件。


我的配置文件中已有该文件,我还应该检查什么?
cyber8200

您是否也在github.com上进行了更改?
CheesusCrust,2017年

3

在Linux的Windows子系统(WSL)上,这是我发现可以使用的唯一解决方案:

eval `ssh-agent` ; ssh-add ~/.ssh/id_rsa

ssh代理未在WSL中正确注册是一个问题。


算了,但这就是解决我的问题的原因。
Nam Kim

3

如果您想阻止Git总是要求您提供GitHub存储库的登录凭据,则可以轻松完成此操作。

使用SSH代替HTTPS

您可以使用SSH而不是HTTPS来更新源远程”

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

配置Git以存储您的密码和用户名

这是使Git存储用户名和密码的方法:

git config --global credential.helper store

接下来,保存会话的用户名和密码:

git config --global credential.helper cache

2

我同意“ codehugger”并使用“ orkoden”的说明对我有用-在NetBeans 7.3上-右键单击文件并选择上下文菜单时-推动-打开“推到远程”窗口-有两个这里的选项:

  1. origin:https://github.com/myaccount/myproject.git/

  2. https://github.com/myaccount/myproject.git/

如您所见,区别在于URL中的origin参数-您不想选择此选项(1),而是要检查选项(2),这对我来说很好。


2

第1步:检查当前配置

cat .git/config

你会得到:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/path_to_your_git.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[user]
    name = your_username
    email = your_email
[branch "master-staging"]
    remote = origin
    merge = refs/heads/master-staging

步骤2:删除您的远程来源

git remote rm origin

步骤3:使用您的用户名和密码重新添加远程源

git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git

再次添加远程原点后,您还需要将分支远程和本地对齐-类似于: git branch --set-upstream master origin/master
Richard Bown

2

如果每次尝试与GitHub交互时Git提示您输入用户名和密码,则可能是您的存储库使用了HTTPS克隆URL。

使用HTTPS远程URL有一些优点:它比SSH更容易设置,并且通常通过严格的防火墙和代理来工作。但是,它还会提示您每次拉出或推送存储库时都输入GitHub凭据。

您可以配置Git为您存储密码。对于Windows

git config --global credential.helper wincred

2

运行macOS Cataline 10.15,钥匙串缓存方法不适用于我。我想用https://ssh

这对我有用:

git remote rm origin

git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git

这也应该在GitLab上工作

确保用户名是否包含电子邮件地址,以删除该@email部件,否则您将收到错误提示URL using bad/illegal format or missing URL

希望这可以帮助!


这是唯一为我工作的解决方案。your_git_username至关重要。实际上没有必要放置:your_git_password。此时,即使它仍然要求输入“密码”,它现在也将接受帐户密码。
kbulgrien

1

根据您的配置,有不同种类的身份验证。这里有一些:

  1. git credential-osxkeychain

    如果您的凭证无效,请通过以下方式将其删除:

      git credential-osxkeychain erase
    

    要么:

      printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
    

    因此,Git不会再询问您钥匙串许可。然后再次配置它。

    请参阅: GitHub上的OS X钥匙串更新凭证

  2. 您的SSH RSA密钥。

    为此,您需要将您的SSH密钥与添加的密钥进行比较,如果使用的是正确的身份,则按ssh-add -L/进行检查ssh-add -l

  3. 您的HTTPS身份验证(如果您使用的https不是ssh协议)。

    使用~/.netrc%HOME%/_netrc在Windows上)提供您的凭据,例如

      machine stash1.mycompany.com
      login myusername
      password mypassword
    

了解更多信息:在Stack Overflow 与GitHub同步


1

在将密钥用于GitHub之前,请按照教程测试SSH连接中的此步骤进行操作:

$ ssh -T git@github.com
# Attempts to ssh to GitHub



0

Microsoft Stack解决方案(Windows和Azure DevOps)

首先打开.git/config文件以确保地址看起来像:

protocol://something@url

例如.git / config用于Azure DevOps:

[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

如果问题仍然存在,请打开Windows Credentials Manager,单击名为Windows Credentials的保险箱。删除所有与git相关的凭据。

现在,下次您登录git时,它将不再消失。


0

如果您已设置SSH代理,则也可以将其添加到您的列表中,~/.gitconfig以强制git将SSH用于所有GitHub存储库而不是HTTPS:

[url "ssh://git@github.com/"]
    insteadOf = git://github.com/
    insteadOf = https://github.com/

(如果您主要使用公共仓库,则也可以使用pushInsteadOf而不是insteadOf,因为从公共仓库读取数据无需身份验证即可完成)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.