我如何避免用户名和密码的规格在每个git推送?

git push我的工作到一个远程Git存储库。

每个push都会提示我输入usernamepassword。我想避免它的每一个推送,但如何配置以避免它?

363167 次浏览

你必须设置一个SSH私钥,你可以回顾这个页面,如何在Mac上进行设置,如果你在linux上,指南应该几乎相同,在Windows上你需要像MSYS这样的工具。

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密钥

下面是上述步骤在putty gen上的预排

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

这一步不同,取决于遥控器的设置方式。

  • 如果它是一个GitHub存储库,你有管理权限,去settings,然后点击'add SSH key'。将~/.ssh/id_rsa.pub的内容复制到标记为'Key'的字段中。

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

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

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

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

只需使用--repo选项git push命令。是这样的:

$ git push --repo https://name:password@bitbucket.org/name/repo.git
我正在使用https链接(https://github.com/org/repo.git)

git@github.com:org/repo.git

转换为我解决了这个问题!

我用了帕维尔建议的答案,它对我很有效。我的不同之处在于在添加遥控器时这样做:git remote add (alias) https://(name:password)@github.com/(the remote address).git

如果您已经设置了SSH密钥,并且仍然得到密码提示,请确保表单中有您的回购URL

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

而不是

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

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

git remote show origin

你可以像这样用git remote set-url改变URL:

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

使用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>

Use还应该指定缓存到期

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

启用凭据缓存后,它将为7200秒(2小时)缓存。

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

将git客户端连接到操作系统凭据存储。例如,在Windows中,您将凭据帮助器绑定到wincred:

git config --global credential.helper wincred

是否有一种方法跳过密码输入时,使用https://在GitHub?< / >

无限期保存

你可以使用git-credential-store via

git config credential.helper store

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

使用此助手将在磁盘上存储未加密的密码,仅受文件系统权限的保护。如果这不是一种可以接受的安全折衷,请尝试git-凭据-缓存,或寻找与操作系统提供的安全存储集成的帮助器。

使用暂停

使用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自动填充的相同系统加密的。在命令行上运行以下命令将启用此特性:您还需要使用Keychain应用程序在Keychain中存储凭据。
  • 如果你使用Windows,你可以安装一个名为“Git Credential Manager for Windows”的助手。这类似于上面描述的" osxkeychain "帮助,但使用Windows凭据存储来控制敏感信息。它可以在https://github.com/Microsoft/Git-Credential-Manager-for-Windows找到。(重点煤矿)

这一切都是因为git在克隆/拉/推/取命令中没有提供通过管道发送凭证的选项。尽管它提供了证明。Helper,它存储在文件系统或创建一个守护进程等。通常,GIT的凭据是系统级的凭据,调用GIT命令的应用程序有责任保证它们的安全。非常不安全。

以下是我必须解决的问题。 1. Git版本(Git——version)应该大于或等于1.8.3

GIT克隆

对于克隆,使用“git克隆URL”,将URL的格式从http://{myuser}@{my_repo_ip_address}/{myrepo_name.git}改为http://{myuser}:{mypwd}@{my_repo_ip_address}/{myrepo_name.git}

然后清除存储库中的密码,如下一节所示。

清除

现在,这个已经消失了

  1. 写了密码在git远程起源。输入“git remote -v”查看损坏情况。通过设置不带密码的远程源URL来纠正这个问题。“git remote set_url origin 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有正斜杠,所以需要用两个反斜杠进行转义。对于ex,对于URL http://kris:passs123@192.168.0.1/proj.git -> http:\\/\\/kris:passs123@192.168.0.1\\/ project .git
  3. .git

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

GIT获取/拉/推

  1. 在git远程url中设置密码为:"git remote set_url origin http://{myuser}:{mypwd}@{my_repo_ip_address}/{myrepo_name.git}"
  2. 发出git fetch/push/pull命令。然后将不会提示您输入密码。
  3. 按照前一节的方法进行清理。不要错过。

第一步-

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

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

它将询问密码短语和文件名(默认为~/)。ssh / id_rsa ~ / . ssh / id_rsa . pub)

步骤2 -

一旦文件创建,添加公钥id_rsa。Pub到github帐户SSH部分。

第三步-

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

ssh-add ~/.ssh/id_rsa

步骤4 -

现在使用以下命令将远程url git@github.com:user_name/repo_name.git添加到本地git repo中。

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

这是它。

我在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密钥=>保存

看起来,至少在Windows上使用TortoiseGIT时,可以创建SSH密钥并将其传输到GIT服务器,只需使用:

> ssh-keygen.exe
> ssh-copy-id [username]@[GIT_server]

在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

如果你的电脑是安全的,或者你不关心密码安全,这可以很简单地实现。假设远程存储库在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,或任何记录你的网络访问的人,可以很容易地

  2. 任何进入你电脑的人都可以使用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>

只是想指出上面说过几次的解决方案:

git config credential.helper store

在此之后,您可以使用任何需要密码的命令。你不需要用力。之后,你就不需要再输入你的用户名/密码了。

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

git config --global credential.helper wincred

请参考以下github文档:

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

据我所知,有两种安全方法:ssh使用密钥库加密的Passwd

SSH

  1. 登录你的github;
  2. 访问:https://github.com/settings/keys;
  3. 新的SSH密钥;
  4. cat ~/.ssh/id_rsa.pub,粘贴在那里,命名并保存它(如果你没有这样的文件,用ssh-keygen -t rsa为自己生成一个——所有提示都是输入);
  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并确认是享受password-free的世界。

passwd使用密钥库加密

如果你只是像其他人提到的那样使用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

我建议使用凭证管理器来存储GitHub凭证。使用git config --global credential.helper store是不安全的,因为它以明文形式存储GitHub密码。 对于Linux, libsecret是一个很好的选择。对于Ubuntu和其他一些linux发行版,您可以执行以下操作:

安装:

sudo apt-get update
sudo apt install libsecret-1-0 libsecret-1-dev
sudo apt install gnome-keyring

创建

cd /usr/share/doc/git/contrib/credential/libsecret/
Sudo make

配置git使用libsecret存储密码

git config --global credentail.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret

在此设置之后,输入密码一次后,您的git凭据将由libsecret存储。

在我的例子中,使用SSH,在将公钥添加到GitHub之后,然后将远程设置为git@github.com/username/reponame.git之类的东西,以及在本地永久添加私钥。本地命令如下:

ssh-add

ssh-add - k

我想有些人可能忽略了后一步。