每次推送时Git都要求输入用户名

877

每次我尝试向我的repo推送时,git都要求输入用户名和密码

我每次重新输入密码都没有问题,但问题是输入用户名。我使用https来克隆我的存储库。

那么,如何配置git,使其不会在每次git push时要求输入用户名

我是Linux新手,但如果我没记错,在Windows中git push只需要输入密码。


1
相关问题:https://dev59.com/t3E95IYBdhLWcg3wm_Mu - Wug
4
请按照这些指示操作,并省略密码行。 - Wug
如果您只想保存用户名,那很简单,只需执行以下操作: https://help.github.com/articles/setting-your-username-in-git/ - Jim In Texas
我也有同样的问题,在这里链接了对我有用的答案:https://dev59.com/PFsV5IYBdhLWcg3wrAZJ#35942890 - Benj
显示剩余5条评论
31个回答

1200

编辑(通过@dk14的建议进行修改,由管理员和评论)

警告:如果您使用答案中的credential.helper store,则您的密码将完全未加密(“原样”)存储在~/.git-credentials中。如果您的雇主对安全问题毫无容忍,请参阅下面的评论部分或“关联”部分的答案。

尽管已经被接受,但它并没有回答实际的OP问题,即仅省略用户名(而不是密码)。对于具有这个确切问题的读者,@grawity的答案可能会很有用。


原始答案(由@Alexander Zhu提供):

您可以使用以下命令存储凭据

$ git config credential.helper store
$ git push http://example.com/repo.git
Username: <type your username>
Password: <type your password>

我建议你阅读以下内容:
$ git help credentials


205
警告,此方法没有安全性。您的密码以明文形式存储。 - Mark Lakata
14
您可以在这里找到更好的实现安全的方法 - https://dev59.com/F14c5IYBdhLWcg3wSIkt#28104587 - dk14
8
请告诉我如何撤销这个答案中的命令?撤销后,我将使用安全的方法存储凭据。 - MasterJoe
34
尝试运行命令 git config --unset credential.helper 以取消凭据助手。 - dk14
1
不要忘记设置超时时间,默认为15分钟 - 将值设置为30000000以获得约1年的时间。在此处找到:stackoverflow.com/a/35942890/1579667 - Benj
显示剩余11条评论

230
你可以在本地代码库的 .git/config 文件中完成这个操作。该文件包含一个名为“remote”的部分,其中有一个名为“url”的条目。 “url” 条目应包含您要讨论的存储库的 https 链接。
当您在主机“url”前缀中加入您的用户名时,git 就不再需要询问您的用户名了。以下是一个示例:
url = https://username@repository-url.com

7
如果您在用户名或密码中使用特殊字符,则需要对它们进行转义。请参阅http://en.wikipedia.org/wiki/Percent-escape以获取正确的转义字符。例如,"!@#" [不包括引号]将被替换为"%21%40%23"。另请参见下面的"Daniel Lerch"答案。 - nsof
1
其他在同一代码库上工作的人能看到我的用户名吗? - CodyBugstein
23
这应该是对原帖问题的正确回答,即“如何持久化用户名,而非密码”。这个答案不仅是持久化用户名的正确方法,而且避免了可能存在的 git config credential.helper store 安全风险。 - RayLuo
我尝试了这个,但出现了以下错误:ssh: Could not resolve hostname https: No address associated with hostname fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 你确定你的示例是正确的吗? - Zoey Hewll
1
我尝试了这个,得到了无法访问'https://<me>@bitbucket.org:<x>/<y>.git/': 非法的端口号 - Ian Grainger
显示剩余2条评论

157

按照GitHub上这篇文章的说明添加新的SSH密钥。

如果Git仍然要求输入用户名和密码,请尝试在远程URL中将https://github.com/更改为git@github.com:

$ git config remote.origin.url 
https://github.com/dir/repo.git

$ git config remote.origin.url "git@github.com:dir/repo.git"

31
这应该是正确的答案!保存您的凭据非常不安全。如果我已经放置了一个SSH密钥,那么它只会要求我的凭据,因为我没有按照这里所概述的正确URL。 - Alexis Wilke
7
你可以使用以下命令修改远程 Git 仓库的 URL:git config remote.origin.url "ssh://git@yourRepoHost/yourRepoName.git" - ndarkness
2
git config remote.origin.url git@gitlab.com:adammajewski/ray-backward-iteration.git - Adam
我必须记住使用SSH URL而不是HTTP URL进行克隆。这样可以节省一个额外的步骤。 - Allan
git@github 的 URL 是可行的,但我还需要创建一个个人访问令牌和 SSH 密钥才能使我的身份验证工作正常。 - Dani Amsalem
如果您的SSH密钥有密码短语,则此方法无法正常工作。 - Rainb

146

Git代码库的永久认证

运行以下命令启用凭据缓存:

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

Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

使用时应指定缓存过期时间


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

启用凭证缓存后,它将被缓存 7200秒(2小时)


阅读凭证文档

$ git help credentials

我将超时时间设置为7200。但后来我想将其设置为5以进行测试。因此,我将其设置为5,但当我在30秒后尝试再次推送时,没有要求输入用户名或密码。 - Buttle Butkus
可能你的凭证没有全局存储。 - Jaykumar Patel
关于安全性,值得参考文档:“此命令将凭据缓存在内存中,以供未来的 Git 程序使用。存储的凭据永远不会接触磁盘,并在可配置的超时后被遗忘。” https://git-scm.com/docs/git-credential-cache - mloskot
4
“git config credntial.helper store”这个命令会将明文凭据存储在“/.git-credentials”文件中,很危险,你不觉得吗?我认为(根据我的经验),使用“git config --clogal credential.helper 'cache --timeout 7200'”命令就足够了。它会创建目录:“/.git-credential-cache”,里面包含缓存文件。因此,只需执行这个命令,而不要运行“...store”命令。 - MacMartin
4
对我没用。每次仍然要求密码。 - Ian Grainger

72

我发现最简单的方法是使用这个命令:

git config --global credential.https://github.com.username <your_username>

这适用于按网站进行的设置,并修改您的全局git配置。

要查看更改,请使用:

git config --global --edit

1
由于某种原因,这是唯一对我有效的方法。谢谢! - mathetes
这个方法安全吗?Github密码只存储在本地计算机上,不会被推送到Github吗? - Akin Hwan
1
我不知道为什么这不是被批准的答案,该命令完美地运行并且只回答了问题:存储用户名,而不是密码。谢谢Ben! - Amael H.
您还可以运行以下命令: [ git config --global credential.helper 'cache --timeout=3600' ] 这样,您的密码将在每次登录后保存一个小时。 - Oz Ben-David
这就是我想要的答案。谢谢。我想明确输入密码(以免意外 git 推送),但不想输入用户名。 - anishsane
简单的解决方案适用于多个结帐,喜欢它。 - BeyelerStudios

39
如果您使用的是https而不是ssh,您可以在.git/config中编辑"url"就像user701648所说的那样,但如果您愿意,也可以添加密码:
url = https://username:password@repository-url.com

2
如果我的密码中包含 @,会怎么样呢? url = https://username:abc@123@repository-url.com 它给我返回了错误信息:Could not resolve host: @123@git.com - Rahul Mankar
当服务器重定向时(例如从FOO到FOO.git),“用户名”部分似乎被忽略了。 - Mikhail T.
@RahulMankar 用户名和密码都应该进行URL编码(例如在浏览器控制台中使用encodeURIComponent()函数)。 - user3125367
1
@RahulMankar 在电子邮件中使用 %40 代替 @。 例如:url = https://name%40domain.com:password@repository-url.com - DEner

29
git config --global credential.helper cache

1
这是关于Linux的更好的答案。 - Larry

27
你可以在你的 Git 配置文件中设置一个类似以下的内容来为给定站点上的所有存储库设置你的用户名。你需要将 `https://example.com` 和 "me" 更改为实际的 URL 和你的实际用户名。
[credential "https://example.com"]
    username = me

(这直接来自于 "git help credentials")


我找了很久,直到找到这个答案。应该将其设置为正确答案。谢谢。 - Tianshu Wang

22

复制的存储库进行更改是有效的:

git remote set-url origin git@github.com:gitusername/projectname.git

使用缓存凭据是有效的,设置超时时间可以使事情变得不那么烦人。如果您使用Windows凭据助手,则应该是最简单的方法(特别是如果SSH被阻止)。


这是一个正确的答案适用于GitHub(问题明确要求...不确定为什么你被踩了)。 - Tim Groeneveld
这样做会完全破坏我推送到GitHub的能力: git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. 我不建议使用这种方法。 - sh37211

13

除了user701648的答案之外,您还可以使用以下命令将凭据存储在您的主文件夹中(全局适用于所有项目),而不是项目文件夹中:

$ git config --global credential.helper store
$ git push http://example.com/repo.git
Username: <type your username>
Password: <type your password>

完全正常运作 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接