如何避免每次git push时都指定用户名和密码?


317

git push我的工作提高到一个远程的Git仓库。

一切push都会提示我输入usernamepassword。我想在每次推送时都避免使用它,但是如何配置以避免它呢?


6
答案可以在这里找到:stackoverflow.com/questions/6565357/...
kbdjockey

3
长话短说:对于github,只需遵循以下两个链接help.github.com/articles/generating-ssh-keys help.github.com/articles/changing-a-remote-s-url
JRun

对于bitbucket,请点击此链接
-JDP

Answers:


346

1.生成SSH密钥

Linux / Mac

打开终端以创建ssh密钥:

cd ~                 #Your home directory
ssh-keygen -t rsa    #Press enter for all values

对于Windows

(仅在提交程序能够使用证书/私有和公共ssh密钥的情况下有效)

  1. 使用Putty Gen生成密钥
  2. 将密钥导出为开放的SSH密钥

这是上述步骤的腻子生成演练

2.将SSH密钥与远程存储库相关联

此步骤因遥控器的设置方式而异。

  • 如果它是GitHub存储库,并且您具有管理权限,请转到设置,然后单击“添加SSH密钥”。将您的内容复制~/.ssh/id_rsa.pub到标有“密钥”的字段中。

  • 如果您的存储库由其他人管理,请给管理员您的id_rsa.pub

  • 如果您的远程存储库是由您管理的,则可以使用以下命令,例如:

    scp ~/.ssh/id_rsa.pub YOUR_USER@YOUR_IP:~/.ssh/authorized_keys/id_rsa.pub

3.将您的远程URL设置为支持SSH 1的表单

如果您已完成上述步骤,但仍收到密码提示,请确保您的回购URL格式为

git+ssh://git@github.com/username/reponame.git

相对于

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

要查看您的回购URL,请运行:

git remote show origin

您可以使用以下方法更改URL:

git remote set-url origin git+ssh://git@github.com/username/reponame.git

[1]本节结合了Eric P的回答


3
我在ubuntu上运行了第1步和第2步,但仍然要求我提供u_id passwd。我还跑了:ssh -T git@github.com。还是一样。该怎么办?
Radhika

4
@Rads您是否尝试过Eric P的其他答案?
2015年

2
@dialex他的意思是管理远程git存储库的人。
selalerer 2015年

5
git remote set-url origin git + ssh://git@github.com/username/reponame.git这个命令对我有帮助。
人工智能

2
这对我git remote set-url origin git@github.com:/username/projectname.git
Kurt

181

永久通过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小时)

注意:凭据帮助程序将未加密的密码存储在本地磁盘上。


4
谢谢。您能解释一下config命令的作用吗?我不知道为什么我第一次推送到仓库时甚至不要求我输入密码。
HelloWorldNoMore

1
@vivoconunxino可能是因为它本来就不安全。在git联机帮助页上:“使用此帮助程序会将未加密的密码存储在磁盘上,仅受文件系统权限保护。”
cmaster-恢复莫妮卡

15
此答案缺少有关store凭据帮助器将密码存储在未加密的磁盘上的警告。
cmaster-恢复莫妮卡

1
@DavidRTribble:设置为缓存吗?或删除相关文件,请参见git-scm.com/docs/git-credential-store
serv-inc

1
@DavidRTribble:更好:git config --unset credential.helper
serv-inc

116

如果您已经设置了SSH密钥,但仍收到密码提示,请确保您的回购URL格式为

git+ssh://git@github.com/username/reponame.git

相对于

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

要查看您的回购URL,请运行:

git remote show origin

您可以这样更改URL git remote set-url

git remote set-url origin git+ssh://git@github.com/username/reponame.git

这是在我在git init本地使用后解决了我的问题,然后在GitHub网站上从一个新仓库中添加了远程后尝试推送的问题。
sheldonkreger 2014年

1
不知道为什么这不是接受的答案的一部分。谢谢!
jwalk

1
接受答案应由实际接受答案加此答案组成。
Puce

3
您可以省略“ git + ssh://”,而只需使用git@github.com/username/reponame.git
Ivan Shulev,2016年

1
@IvanShulev我最初尝试时没有git + ssh,但没有成功
Antonello

40

只需使用--repogit push命令的选项即可。像这样:

$ git push --repo https://name:password@bitbucket.org/name/repo.git

37
或者,您可以使用git remote set-url origin https://name:password@github.com/repo.git
ACyclic 2012年

name@github.com/....git如果您不介意每次都被密码困扰,那么我也将URL设置为可行的。
星期三)

对于github用户,git push --repo https://github.com/Username/repo 它无需.git 扩展即可工作
Pe Dro

24

无限期保存

您可以使用混帐凭据店通过

git config credential.helper store

密码将未加密的密码存储在文件系统中

使用此帮助程序会将密码未加密地存储在磁盘上,仅受文件系统权限保护。如果这不是可接受的安全性折衷方案,请尝试使用git-credential-cache,或查找与您的操作系统提供的安全存储集成在一起的帮助程序。

有超时

使用git-credential-cache,默认情况下将密码存储15分钟。

git config credential.helper cache

要设置其他超时时间,请使用--timeout(此处为5分钟)

git config credential.helper 'cache --timeout=300'

无限期安全保存(OS X和Windows)

  • 如果您使用的是Mac,则Git带有“ osxkeychain”模式,该模式将凭据缓存在系统帐户附带的安全钥匙串中。此方法将凭据存储在磁盘上,并且永不过期,但是使用存储HTTPS证书和Safari自动填充的同一系统对其进行加密。在命令行上运行以下命令将启用此功能:git config --global credential.helper osxkeychain。您还需要使用“钥匙串”应用程序将凭据存储在“钥匙串”中。
  • 如果您使用的是Windows,则可以安装名为“ Git Credential Manager for Windows”的帮助程序。这类似于上述的“ osxkeychain”帮助程序,但是使用Windows凭据存储来控制敏感信息。可以在https://github.com/Microsoft/Git-Credential-Manager-for-Windows中找到它。[重点是我的]

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

1
当您被迫使用https时,这将很有帮助。如果使用ssh,则服务器上的git会挂起,因此我无法选择SSH密钥。
Sridhar Sarnobat,

8

我使用的是https链接(https://github.com/org/repo.git)而不是ssh链接;

git@github.com:org/repo.git  

切换为我解决了问题!


6

步骤1 -

使用以下命令在Linux系统上创建SSH密钥

ssh-keygen -t rsa -b 4096 -C "your_email"

它将询问密码和文件名(默认为〜/ .ssh / id_rsa,〜/ .ssh / id_rsa.pub)

第2步 -

创建文件后,将公共密钥id_rsa.pub添加到github帐户ssh部分。

步骤3-

在您的机器上,使用以下命令将私钥id_rsa添加到ssh-agent

ssh-add ~/.ssh/id_rsa 

第四步 -

现在,使用以下命令将远程URL git@github.com:user_name / repo_name.git添加到本地git存储库中。

git remote remove origin
git remote add origin git@github.com:user_name/repo_name.git

而已。



5

在Windows操作系统上,请改用此命令,这对我有用:

https://{Username}:{Password}@github.com/{Username}/{repo}.git

例如

git clone https://{Username}:{Password}@github.com/{Username}/{repo}.git

git pull https://{Username}:{Password}@github.com/{Username}/{repo}.git

git remote add origin https://{Username}:{Password}@github.com/{Username}/{repo}.git

git push origin master

5

只是想指出一些关于上述解决方案的内容:

git config credential.helper store

此后,您可以使用任何需要密码的命令。您不必推动。(例如,您也可以拉出)之后,您无需再次输入用户名/密码。


3

我使用了Pavel建议的答案,并且对我有用。我的区别是在添加遥控器时这样做,如下所示:git remote add (alias) https://(name:password)@github.com/(the remote address).git


3

运行以下命令为我解决了这个问题。

git config --global credential.helper wincred

请参考以下github文档:

https://help.github.com/articles/caching-your-github-password-in-git/

3

据我所知,只有两种安全的方法:使用keystore加密的sshpasswd

SSH协议

  1. 登录您的github;
  2. 访问:https//github.com/settings/keys
  3. 新的SSH密钥;
  4. cat ~/.ssh/id_rsa.pub,将其粘贴到此处,命名并保存(如果没有这样的文件,请通过ssh-keygen -t rsa- 为所有提示输入Enter来自己生成一个文件);
  5. 转到本地存储库并通过以下方式更新您的遥控器git remote set-url origin git+ssh://git@github.com/username/reponame.git-您可以先通过git remote -v)进行检查;
  6. 在这里,只需touch t; git add t; git commit -m "test"; git push确认是,即可享受无密码的世界。

使用密钥库加密的密码

如果您只是git config --global credential.helper store像其他人一样使用,则未加密的密码将仅以纯文本格式存储,~/.git-credentials听起来很不安全。

尝试将其加密

sudo apt-get install libgnome-keyring-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/gnome-keyring
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring

git config --global credential.helper store

在这种情况下,您正在使用https://git@github.com/username/reponame.git


2

我在Windows上的解决方案:

  1. 右键单击目录以推送并选择“ Git Bash Here”。
  2. ssh-keygen -t rsa (按Enter键获取所有值)
  3. 检查终端是否: Your public key has been saved in /c/Users/<your_user_name_here>/.ssh/id_rsa.pub
  4. 从指定文件复制公钥。
  5. 转到您的GitHub个人资料=>设置=> SSH和GPG密钥=>新的SSH密钥=>将SSH密钥粘贴到那里=>保存

2

如果您的PC是安全的,或者您不关心密码的安全性,则可以非常简单地实现此目的。假设远程存储库位于GitHub上,并且origin是远程存储库的本地名称,请使用此命令

git remote set-url --push origin https://<username>:<password>@github.com/<repo>

--push标志确保仅更改该git push命令的存储库的URL 。(原始帖子中提出的问题git push仅与命令有关。仅要求推送操作的用户名+密码是GitHub上公共存储库的常规设置。请注意,GitHub上的私有存储库也需要用户名+密码进行拉取和提取操作,因此对于私有存储库,您不想使用--push flag...)

警告:这本质上是不安全的,因为:

  1. 您的ISP或记录您的网络访问的任何人都可以轻松地在URL中以纯文本形式看到密码;

  2. 能够访问您的PC的任何人都可以使用来查看您的密码git remote show origin

这就是为什么使用SSH密钥是可接受的答案的原因。

甚至SSH密钥也不完全安全的。例如,任何可以访问您的PC的人都仍然可以进行使您的存储库崩溃的推送,或者-更糟的是-推送提交对代码进行了细微的更改。(所有推送的提交显然在GitHub上都很明显。但是,如果有人想秘密更改您的代码,他们可以--amend在不更改提交消息的情况下进行先前的提交,然后强制推送它。这在实践中是隐蔽的,很难注意到。 )

但是泄露密码更糟。如果攻击者了解您的用户名和密码,他们可以执行一些操作,例如将您锁定在自己的帐户之外,删除您的帐户,永久删除存储库等。


另外,为简便起见为了安全起见只能在URL中提供用户名,这样您每次都必须输入密码,git push而不必每次都输入用户名。(我很喜欢这种方法,每次输入密码时我都必须停下来思考一下git push,因此我绝不会git push偶然。)

git remote set-url --push origin https://<username>@github.com/<repo>

如果password具有@,在git服务器中@之后,会破坏命令密码的想法?
普拉纳夫·辛格'18

如果您的密码包含“ @”,则表示您自己位于此处。您可以更改密码吗?
radfast

当我为具有服务帐户(不是个人)的持续集成进行自动化时,需要提出更改密码的请求。现在使用SSH密钥进行安全登录
Pranav Singh '18

1

这是因为git在clone / pull / push / fetch命令中没有提供选项来通过管道发送凭据的缘故。尽管它提供了credential.helper,但它存储在文件系统上或创建守护程序等。通常,GIT的凭据是系统级别的凭据,确保它们安全的责任在于调用git命令的应用程序。确实非常不安全。

这是我必须解决的问题。1. Git版本(git --version)应大于或等于1.8.3。

吉特克隆

对于克隆,将URL从以下格式更改为“ git clone URL”:http:// {myuser} @ {my_repo_ip_address} / {myrepo_name.git}更改为http:// {myuser}:{mypwd} @ {my_repo_ip_address} /{myrepo_name.git}

然后像下一节中那样清除密码存储库。

采购

现在,这将过去,

  1. 将密码写成git remote origin。键入“ git remote -v”以查看损坏。通过设置不带密码的远程原始URL来更正此问题。“ git remote set_url起源http:// {myuser} @ {my_repo_ip_address} / {myrepo_name.git}”
  2. 在存储库中的.git / logs中写入密码。使用unix命令替换所有pwd实例,例如find .git / logs -exec sed -i's / {my_url_with_pwd} // g'{} \; 在这里,{my_url_with_pwd}是带有密码的URL。由于该URL具有正斜杠,因此需要用两个反斜杠对其进行转义。例如,对于URL http:// kris:passs123@192.168.0.1/proj.git- > http:\\ / \\ / kris:passs123@192.168.0.1 \\ // proj.git

如果您的应用程序使用Java发出这些命令,请使用ProcessBuilder而不是Runtime。如果必须使用Runtime,请使用getRunTime()。exec,它将String数组作为参数,将/ bin / bash和-c用作参数,而不是将单个String作为参数的参数。

GIT抓/拉/推

  1. 在git remote url中将密码设置为:“ git remote set_url origin http:// {myuser}:{mypwd} @ {my_repo_ip_address} / {myrepo_name.git}”
  2. 发出命令git fetch / push / pull。然后将不会提示您输入密码。
  3. 像上一节一样进行清除。别错过。

0

您必须设置SSH私钥,您可以查看此页面,以及如何在Mac上进行设置;如果您使用的是Linux,则指南应几乎相同,而在Windows上,则需要MSYS之类的工具。


0

似乎至少在Windows上使用TortoiseGIT时,可以使用以下方法创建SSH密钥并将其传输到GIT服务器:

> ssh-keygen.exe
> ssh-copy-id [username]@[GIT_server]
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.