我git push我的工作到一个远程Git存储库。
git push
每个push都会提示我输入username和password。我想避免它的每一个推送,但如何配置以避免它?
push
username
password
你必须设置一个SSH私钥,你可以回顾这个页面,如何在Mac上进行设置,如果你在linux上,指南应该几乎相同,在Windows上你需要像MSYS这样的工具。
打开终端创建ssh密钥:
cd ~ #Your home directory ssh-keygen -t rsa #Press enter for all values
(只有当提交程序能够使用证书/私有&公共SSH密钥)
下面是上述步骤在putty gen上的预排
这一步不同,取决于遥控器的设置方式。
如果它是一个GitHub存储库,你有管理权限,去settings,然后点击'add SSH key'。将~/.ssh/id_rsa.pub的内容复制到标记为'Key'的字段中。
~/.ssh/id_rsa.pub
如果您的存储库由其他人管理,请将您的id_rsa.pub交给管理员。
id_rsa.pub
scp ~/.ssh/id_rsa.pub YOUR_USER@YOUR_IP:~/.ssh/authorized_keys/id_rsa.pub < / p >
scp ~/.ssh/id_rsa.pub YOUR_USER@YOUR_IP:~/.ssh/authorized_keys/id_rsa.pub
如果您已经执行了上述步骤,但仍然得到密码提示,请确保表单中有您的回购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命令。是这样的:
--repo
$ git push --repo https://name:password@bitbucket.org/name/repo.git
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
git remote add (alias) https://(name:password)@github.com/(the remote address).git
如果您已经设置了SSH密钥,并且仍然得到密码提示,请确保表单中有您的回购URL
你可以像这样用git remote set-url改变URL:
git remote set-url
运行以下命令启用凭据缓存。
$ 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分钟)
--timeout
git config credential.helper 'cache --timeout=300'
如果你使用的是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命令的应用程序有责任保证它们的安全。非常不安全。
GIT克隆
对于克隆,使用“git克隆URL”,将URL的格式从http://{myuser}@{my_repo_ip_address}/{myrepo_name.git}改为http://{myuser}:{mypwd}@{my_repo_ip_address}/{myrepo_name.git}
然后清除存储库中的密码,如下一节所示。
清除
现在,这个已经消失了
如果您的应用程序使用Java来发出这些命令,请使用ProcessBuilder而不是Runtime。如果必须使用Runtime,请使用getRunTime()。exec以字符串数组作为参数,以/bin/bash和-c作为参数,而不是以单个字符串作为参数。
GIT获取/拉/推
第一步-
使用以下命令在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上的解决方案:
ssh-keygen -t rsa
Your public key has been saved in /c/Users/<your_user_name_here>/.ssh/id_rsa.pub
看起来,至少在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是远程存储库的本地名称,使用此命令
origin
git remote set-url --push origin https://<username>:<password>@github.com/<repo>
--push标志确保只更改git push命令的存储库URL。(在最初的帖子中所问的问题只是关于git push命令。仅推送操作需要用户名+密码是GitHub上公共存储库的正常设置。注意,GitHub上的私人存储库也需要用户名+密码来进行拉取操作,所以对于私有存储库,你不会想要使用--push flag…)
--push
--push flag
警告:这本质上是不安全的,因为:
你的ISP,或任何记录你的网络访问的人,可以很容易地
任何进入你电脑的人都可以使用git remote show origin查看你的密码。
这就是为什么使用SSH密钥是可以接受的答案。
甚至SSH密钥也是不完全安全。例如,任何获得PC访问权限的人仍然可以进行推送操作,破坏你的存储库,或者更糟糕的是,对你的代码进行细微更改的推送提交。(所有推送提交在GitHub上明显可见。但是如果有人想秘密地改变你的代码,他们可以在不改变提交消息的情况下--amend之前的提交,然后强制推送它。这将是隐秘的,在实践中很难被发现。)
--amend
但是你的密码是更糟糕的是。如果攻击者获得了您的用户名+密码,他们可以做的事情,如锁定您自己的帐户,删除您的帐户,永久删除存储库等。
或者——为了简单起见而且安全——你可以在URL中提供只有你的用户名,这样你每次git push都必须输入你的密码,但不必每次都输入你的用户名。(我很喜欢这种方法,每次git push时必须输入密码,这样我就不会意外地git push。)
git remote set-url --push origin https://<username>@github.com/<repo>
只是想指出上面说过几次的解决方案:
在此之后,您可以使用任何需要密码的命令。你不需要用力。之后,你就不需要再输入你的用户名/密码了。
运行下面的命令为我解决了这个问题。
请参考以下github文档:
https://help.github.com/articles/caching-your-github-password-in-git/
据我所知,有两种安全方法:ssh或使用密钥库加密的Passwd。
cat ~/.ssh/id_rsa.pub
git remote -v
touch t; git add t; git commit -m "test"; git push
如果你只是像其他人提到的那样使用git config --global credential.helper store,你的未加密的密码将只是存储在~/.git-credentials下的纯文本中,这听起来并不安全。
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。
https://git@github.com/username/reponame.git
安装:
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
我想有些人可能忽略了后一步。