我从我的 GitHub 帐户克隆了一个 Git 存储库到我的 PC。
我想同时使用我的 PC 和笔记本电脑,但只有一个 GitHub 帐户。
当我尝试使用我的 PC 向 GitHub 推送或从 GitHub 拉取时,它需要用户名和密码,但在我使用笔记本电脑时不需要!
我不想每次与 origin
. 我在这里想念什么?
一个常见原因是使用默认 (HTTPS) 而不是 SSH 进行克隆。您可以通过转到您的存储库,单击“克隆或下载”,然后单击 URL 字段上方的“使用 SSH”按钮并更新源远程的 URL 来纠正此问题,如下所示:
git remote set-url origin git@github.com:username/repo.git
您可以使用以下命令检查是否已将远程添加为 HTTPS 或 SSH:
git remote -v
这在 GitHub 中有记录:将远程 URL 从 HTTPS 切换到 SSH。
运行以下命令以启用凭证缓存:
$ git config credential.helper store
$ git push https://github.com/owner/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 小时)。
我刚刚遇到了同样的问题,我发现最简单的解决方案是使用 SSH URL 而不是 HTTPS:
ssh://git@github.com/username/repo.git
而不是这个:
https://github.com/username/repo.git
您现在可以仅使用 SSH 密钥而不是username
and进行验证password
。
除了更改为 SSH,如果您不介意以明文形式输入密码,您还可以继续使用 HTTPS。把它放在你的~/.netrc
,它不会询问你的用户名/密码(至少在 Linux 和 Mac 上):
machine github.com
login <user>
password <password>
添加(参见 VonC 的第二条评论):在 Windows 上,文件名为%HOME%\_netrc
.
如果您想加密,还请阅读 VonC 的第一条评论。
如果您有Git 1.7.10 或更新版本,则可以使用另一个附加功能(请参阅 user137717 的评论) 。
如果您使用 HTTPS 克隆 GitHub 存储库,则可以使用凭证助手告诉 Git 在每次与 GitHub 通信时记住您的 GitHub 用户名和密码。
这也适用于 Linux、Mac 和 Windows。
对于对前面的答案感到困惑的外行,您可以这样做:
git remote -v
这将回应类似
origin https://yourname@github.com/yourname/yourrepo.git (fetch)
origin https://yourname@github.com/yourname/yourrepo.git (push)
然后你可以运行许多其他人建议的命令,但现在你从上面知道了你的名字和你的仓库,所以你可以从上面剪切并粘贴yourname/yourrepo.git
到:
git remote set-url origin git@github.com:yourname/yourrepo.git
如果您使用 SSH 并且您的私钥使用密码加密,那么当您使用 Git 进行网络操作(如push
、pull
和fetch
.
如果您想避免每次都输入密码,您可以ssh-agent
在每个终端会话中存储一次您的私钥密码凭据,正如我在对无法打开与您的身份验证代理的连接的回答中所解释的那样:
$ eval `ssh-agent -s`
$ ssh-add
在 Windows msysgit Bash 中,您需要评估 的输出ssh-agent
,但我不确定您是否需要在其他开发环境和操作系统中执行相同操作。
ssh-add
.ssh
在您的主文件夹中查找名为 的私钥id_rsa
,这是默认名称,但您可以将文件路径传递给具有不同名称的密钥。
完成终端会话后,可以ssh-agent
使用 kill 标志关闭-k
:
$ ssh-agent -k
如ssh-agent
手册中所述:
-k
终止当前代理(由 SSH_AGENT_PID 环境变量提供)。
此外,它可以采用一个可选的超时参数,如下所示:
$ ssh-add -t <timeout>
where<timeout>
的格式<n>h
为<n>
小时、<n>m
分钟<n>
等。
根据ssh-agent
手册:
-t life
为添加到代理的身份的最大生命周期设置默认值。生命周期可以以秒为单位或以sshd_config(5)中指定的时间格式指定。使用ssh-add(1)为身份指定的生命周期会覆盖此值。如果没有这个选项,默认的最大生命周期是永远。
Cygwin 用户应注意在 Cygwin 中使用 ssh-agent 的潜在安全风险:
人们应该意识到 ssh-agent 在 Cygwin 1下的潜在危险,尽管在本地 netstat 和远程 portscan 下似乎没有人可以访问 /tmp/ssh-foo 中指定的端口...?
[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html
在引用的链接中:
但是,请注意 Cygwin 的 Unix 域套接字根本不安全,因此我强烈反对在Cygwin下使用 ssh-agent。
当您在 Cygwin 下运行 ssh-agent 时,它会在
/tmp/ssh-$USERNAME/
目录中创建 AF_UNIX 套接字。在 Cygwin 下,AF_UNIX 套接字通过 AF_INET 套接字进行模拟。如果您/tmp/ssh-$USERNAME/agent-socket-*
通过记事本查看文件,您可以很容易地看到这一点。你会看到类似的东西!<socket >2080
然后运行
netstat -a
并惊喜!您有一些程序正在侦听端口 2080。它是 ssh-agent。当 ssh 收到来自服务器的 RSA 质询时,它引用相应的/tmp/ssh-$USERNAME/agent-socket-*
(在 Cygwin 下,在我们的例子中,这意味着它将打开到 的连接localhost:2080
)并要求 ssh-agent 使用它拥有的私钥处理 RSA 质询,然后它只是将从 ssh-agent 收到的响应传递给服务器。在 Unix 下,这样的场景没有问题,因为 Unix 内核会在程序尝试访问 AF_UNIX 套接字时检查权限。然而,对于 AF_INET 套接字,连接是匿名的(读作“不安全”)。想象一下,您正在运行 Cygwin ssh-agent。恶意黑客可能会对您的机器进行端口扫描,定位 ssh-agent 使用的开放端口,打开与您的 SSH 服务器的连接,从它接收 RSA 质询,通过他/她找到的开放端口将其发送到您的 ssh-agent,接收RSA 响应,将其发送到 SSH 服务器,瞧,他/她以您的身份成功登录到您的服务器。
来源:设置 Git
以下命令会将您的密码保存在内存中一段时间(对于Git 1.7.10或更高版本)。
$ git config --global credential.helper cache
# Set git to use the credential memory cache
$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after one hour (setting is in seconds)
当您使用https进行 Git pull & push 时,只需remote.origin.url
为您的项目进行配置,以避免每次推送时输入用户名(或/和密码)。
如何配置remote.origin.url
:
网址格式: https://{username:password@}github.com/{owner}/{repo} 网址中的参数: * username
可选,需要时使用的用户名。
验证, 如果指定,则需要认证时无需再次输入用户名。 不要使用电子邮件;使用没有“@”的用户名,否则无法正确解析 URL, * 密码 可选,需要认证时使用的密码。 如果指定,则在需要验证时无需再次输入密码。 提示: 此值存储为纯文本,因此出于安全考虑,请勿指定此参数, * 例如 git config remote.origin.url https://eric@github.com/eric/myproject
ssh
我认为使用ssh
协议是比 更好的解决方案https
,即使设置步骤有点复杂。
粗略的步骤:
ssh-keygen
在 Linux 上,在 windows 上msysgit
提供类似的命令。~/.ssh
. ssh-add
并通过命令将其添加到 ssh 代理。remote.origin.url
为ssh
样式,例如,git@gitlab.com:myaccount/myrepo.git
尖端:
https
@Update - 在和ssh
协议之间切换。只需更改remote.origin.url
就足够了,或者您可以repo_home/.git/config
直接编辑以更改值(例如vi
在 Linux 上使用)。
通常我为每个协议添加一行,并使用#
.
例如
[遥远的“起源”] url = git@gitlab.com:myaccount/myrepo.git # url = https://myaccount@gitlab.com/myaccount/myrepo.git fetch = +refs/heads/*:refs/remotes/origin/*
你可以在 Git 中缓存你的 GitHub 密码:
只需按照 GitHub官方文档中的说明进行操作即可。
按照上述链接中的说明进行操作后,您应该能够向/从您的存储库推/拉,而无需每次都输入您的用户名/密码。
如果您在 Github 帐户上启用了 2FA,则您的常规密码将无法用于此目的,但您可以生成个人访问令牌并使用它来代替。
访问 GitHub 中的Settings
-> Developer Settings
->Personal Access Tokens
页面(https://github.com/settings/tokens/new),并生成具有所有Repo权限的新 Token:
然后页面将显示新的令牌值。保存此值并在推送到 GitHub 上的存储库时使用它代替您的密码:
> git push origin develop
Username for 'https://github.com': <your username>
Password for 'https://<your username>@github.com': <your personal access token>
这是另一种选择:
而不是写
git push origin HEAD
你可以写:
git push https://user:pass@yourrepo.com/path HEAD
显然,对于大多数 shell,这将导致密码被缓存在历史记录中,所以请记住这一点。
对我有用的是编辑.git/config
和使用
[remote "origin"]
url = https://<login>:<password>@gitlab.com(...).git
不用说,这是一种不安全的密码存储方式,但在某些环境/情况下,这可能不是问题。
如果 SSH 密钥或.netrc
文件对您不起作用,那么另一个简单但不太安全的解决方案可能对您有用,它是git-credential-store - 在磁盘上存储凭据的帮助程序:
git config --global credential.helper store
默认情况下,凭据将保存在文件中~/.git-credentials
。它将被创建并写入。
请注意,使用此帮助程序会将未加密的密码存储在磁盘上,仅受文件系统权限保护。如果这可能不是一个可接受的安全折衷方案。
我遇到过同样的问题。
所以我.git/config
从我的项目中更改了文件,
url = https://github.com/<your-user-here>/<your-repo-here>
到
url = git@github.com:<your-user-here>/<your-repo-here>
并将 SSH 公钥添加到设置中的 Git 配置文件中。
对于 SSH 公钥:
cat ~/.ssh/id_rsa.pub
直接更新你的 Git 配置文件(如果你不想记住花哨的命令):
.git/config
在您喜欢的文本编辑器中打开您的文件。它将位于您克隆的文件夹或您执行的存储库git init
中。进入该存储库。.git
是一个隐藏文件夹,按Ctrl+H应该显示隐藏文件夹(ls -a
在终端中)。
以下是该.git/config
文件的示例。复制并粘贴这些行,并确保使用您的 Git 信息更新这些行。
[user]
name = Tux
email = tux@gmail.com
username = happy_feet
[remote "origin"]
url = https://github.com/happy_feet/my_code.git
fetch = +refs/heads/*:refs/remotes/origin/*
使用以下格式更改 SSH 的 URL 部分:
url = git@github.com:happy_feet/my_code.git
(上述格式不会随着各种Git远程服务器如GitHub或Bitbucket而改变。如果您使用Git进行版本控制,则相同):
注意:连接到远程 Git 存储库的 SSH 方式需要您将公共 SSH 密钥添加到 Git 远程服务器(如 GitHub 或 Bitbucket。在设置页面中搜索 SSH 密钥)。
要了解如何生成 SSH 密钥,请参阅: 创建 SSH 密钥
如果您克隆了 HTTPS 而不是 SSH,并且在拉取、推送和获取时遇到用户名和密码提示问题。你可以简单地为 UBUNTU 解决这个问题
第一步:移动到根目录
cd ~/
创建一个文件 .git-credentials
与您一起将此内容添加到该文件中,usename
password
然后githosting URL
https://user:pass@example.com
然后执行命令
git config --global credential.helper store
现在,您将能够毫不费力地从您的 repo 中推送和获取所有详细信息。
对于 Windows Git 用户,运行后git config --global credential.helper store
,如果仍然提示输入密码,你最好检查一下配置文件的写入位置,使用这个命令
git config --list --show-origin
就我而言,在手动编辑配置文件“C:\Program Files\Git\mingw64\etc\gitconfig”并添加以下文本后,它就可以工作了。
[credential]
helper = store
这对我有用:
git remote set-url origin https://username@github.com/username/reponame.git
例子:
git remote set-url origin https://jsmith@github.com/jsmith/master.git
你基本上有两个选择。
如果您在两台机器上使用相同的用户,则需要将 .pub 密钥复制到您的 PC,以便 GitHub 知道您是同一用户。
如果您已经为您的 PC 创建了一个新的 .pub 文件并希望将这些机器视为不同的用户,您需要在 GitHub 网站上注册新的 .pub 文件。
如果这仍然不起作用,可能是因为 ssh 配置不正确并且 ssh 无法找到密钥的位置。尝试
ssh -vv username@github.com
获取更多信息为什么 SSH 失败。
HTTPS 更新:
GitHub 推出了一个适用于 Windows 的新程序,可在您使用 HTTPS 时存储您的凭据:
要使用:
从这里下载程序
运行程序后,它将编辑您的.gitconfig
文件。如果您有几个,请重新检查它是否编辑正确.gitconfig
。如果它没有编辑正确的,请将以下内容添加到您的.gitconfig
[credential]
helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'
注意 . 之后的换行符[credential]
。这是必需的。
打开您的命令行客户端并尝试git push origin master
一次。如果它要求您输入密码,请输入密码,然后您就完成了。密码已保存!
列出您当前的 SSH 密钥:
ls -l ~/.ssh
生成新的 SSH 密钥:
ssh-keygen -t ed25519 -C "your_email@example.com"
您应该替换your_email@example.com
为您的 GitHub 电子邮件地址。
当提示时Enter a file in which to save the key
,按
Enter。
在Enter passphrase (empty for no passphrase)
- 只需按
Enter(对于空密码)。
再次列出您的 SSH 密钥:
ls -l ~/.ssh
现在应该已经添加了文件id_ed25519
和文件。
在后台启动 ssh-agent:id_ed25519.pub
eval $(ssh-agent -s)
将您的 SSH 私钥添加到 ssh-agent:
ssh-add ~/.ssh/id_ed25519
接下来将公钥输出到终端屏幕:
cat ~/.ssh/id_ed25519.pub
将输出复制到剪贴板 ( Ctrl+ Insert)。
转到https://github.com/<your-github-username>
并使用您的用户名和密码登录。
单击右上角的 GitHub 头像,然后单击Settings。在左窗格中单击SSH 和 GPG 密钥。单击绿色按钮New SSH key
并将公共 SSH 密钥粘贴到标记为Key的文本区域中。使用描述性标题,说明您将在哪台计算机上使用此 SSH 密钥。单击添加 SSH 密钥。
如果您当前的本地存储库是使用http和username创建的,则需要重新创建它以便与 SSH 兼容。
首先检查以确保您有一个干净的工作树,这样您就不会丢失任何工作:
git status
然后cd ..
到父目录和rm -fr <name-of-your-repo>
.
最后克隆一个使用 SSH 而不是用户名/密码的新副本:
git clone git@github.com:[your-github-username]/[repository-name].git
参考资料:
https ://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the- ssh-agent
https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account
Settings
-> Developer Settings
-> Personal Access Tokens
GitHub 中的页面(https://github.com/settings/tokens/new),并生成具有所有 Repo 权限的新 Tokengithub.com
-> 单击Show password
然后粘贴token
您刚刚复制的内容。如果您在 Windows 下使用 Git(例如 Git Bash)(并且如果您不想从 HTTPS 切换到 SSH),您也可以使用Git Credential Manager for Windows
此应用程序将为您保留用户名和密码...
正如许多用户所说,您只需将 Git 存储库 URL 从 HTTPS 更改为 SSH。
如果您还没有在您的机器中生成 SSH 密钥,那么您将不得不这样做。
作为附加信息,在进行此更改后,我仍然遇到相同的错误:
没有权限。
就我而言,问题在于我使用 Windows Shell 执行 ngh 命令;由于此命令应打开请求 SSH 短语的提示,而 Windows Shell 不会打开此类提示,因此身份验证失败。
所以,我只需要打开 Git shell 并在那里执行 ngh 命令,每次它要求它时将 SSH 短语放在提示符中,然后“voilà”......它工作得很好!
# gen the pub and priv keys
# use "strange" naming convention, because those WILL BE more than 10 ...
ssh-keygen -t rsa -b 4096 -C "me@corp.com" -f ~/.ssh/id_rsa.me@corp.com@`hostname -s`
# set the git alias ONLY this shell session
alias git='GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me@corp.com.`hostname -s`" git'
# who did what when and why
git log --pretty --format='%h %ai %<(15)%ae ::: %s'
# set the git msg
export git_msg='issue-123 my important commit msg'
# add all files ( danger !!! ) and commit them with the msg
git add --all ; git commit -m "$git_msg" --author "Me <me@corp.com"
# finally
git push
检查您的 git 版本并更新。然后将解决问题
$ git update-git-for-windows
更新说明:当您的 PC git 版本和服务器 git 版本不匹配时,我们可以使用它。