我有两个GitHub帐户,工作帐户和个人帐户,我想在Windows 10中安全地存储它们的凭据。git config --global credential.helper manager只设置了一个用户名和密码,这在我个人帐户的存储库和工作帐户的存储库之间产生了冲突。两个存储库都是使用HTTPS克隆的。我想存储和访问不同的凭证,可能基于仓库用户名。可以吗?我知道SSH是一个选项,但我想知道如何为HTTPS做这件事。
git config --global credential.helper manager
yuvru6vn1#
在Bitbucket上,您可以将用户名添加到远程的HTTPS URL:
https://JerryGoyal@bitbucket.org/path/repo.git
https://bitbucket.org/path/repo.git
由于URL在技术上是不同的,如果你愿意,你可以把你的工作和个人fork都添加为同一个仓库的remote。这项技术在GitHub上也可以使用,但是其他仓库主机可能不支持。
useHttpPath
Git Credential Manager可以根据完整的URL来选择凭证,而不是通过主机名来共享。
credential.useHttpPath
告诉Git在调用凭证提供程序时传递整个仓库URL,而不仅仅是主机名。(这个设置来自Git本身,而不是GCM。)默认值为false。如果您想为 * 完全相同的远程数据库 * 使用不同的远程凭据,则第二种方法不起作用。但是如果您为不同的远程数据库使用不同的URL,则第二种方法应该可以正常工作,即使是从单个本地存储库。
false
这通常是useHttpPath最有用的模式。要为所有Bitbucket远程URL设置该选项,请运行以下命令:
git config --global credential.https://bitbucket.org.useHttpPath true
Git for Windows支持useHttpPath for Azure Repos,您可以在安装位置的etc/gitconfig中查看它。
etc/gitconfig
[credential "https://dev.azure.com"] useHttpPath = true
正如rjmunro所指出的,你可以去掉--global,只使用当前仓库的路径,如果是这样,你也可以去掉主机名:
--global
git config credential.useHttpPath true
然后,主机的存储库将默认为共享主机凭据,但 * 此 * 存储库将使用完整的URL路径来保存和加载其凭据。
从技术上讲,您可以强制自己为 * 每个远程存储库 * 单独添加凭据。这是不必要的冗长,但this answer展示了如何做到这一点:
git config --global credential.useHttpPath true
5jvtdoz22#
更一般地说,您可以使用credential.useHttpPath为同一主机运行的多个存储库分割凭证管理。[‡]在这种情况下,请使用Git 2.27(Q2 2020),因为凭据助手的URL解析已经被更正。参见Jeff King ( peff )的commit 4c5971e(2020年4月14日)。(由Junio C Hamano -- gitster --合并至commit a397e9c,2020年4月22日)
peff
gitster
credential
?
#
签署人:杰夫·金这是不寻常的看到:
https://example.com?query-parameters
中间没有斜杠,比如
https://example.com/some-path?query-parameters
或者甚至:
https://example.com/?query-parameters
但是根据RFC 3986,它是主机名(实际上是"权限组件")的有效结尾。curl将根据标准解析URL,这意味着它将联系example.com,但我们的凭据代码将询问其中包含"?"的虚假主机名。让我们确保遵循标准,更重要的是询问curl将与哪些主机通信。如果我们能让curl为我们解析URL就好了,但是它直到7.62才有了URL解析API,所以我们无论如何都要使用后备代码,而且我们需要在Git二进制文件中使用这段代码,我们已经尽力避免在libcurl上有链接依赖。但至少我们要修正一下解析器,使用curl的解析器可以避免其他潜在的差异,但这会立即缓解已知问题,如果我们最终使用curl,也会帮助我们的后备代码。随着Git 2.35(Q1 2022)的发布,凭证和其他变量值将受益于最新的RFC 3986:匹配每个URL的配置变量名称时,将下划线(_)视为URL中的任何其他URL有效字符。参见Jeff King ( peff )的commit e4c497a(2021年10月12日)。(由Junio C Hamano -- gitster --合并至commit 96eca02,2021年11月29日)
curl
example.com
libcurl
_
urlmatch
URL_HOST_CHARS
报告人:亚历克斯·韦特签署人:杰夫·金当解析一个URL来规范化它时,我们允许主机名只包含点(".")或破折号("-"),加上IPv6文字的括号和冒号。这与RFC 1738中旧的URL标准相匹配,它说:
.
-
host = hostname | hostnumber hostname = *[ domainlabel "." ] toplabel domainlabel = alphadigit | alphadigit *[ alphadigit | "-" ] alphadigit
但这后来被RFC 3986更新了,它更自由:
host = IP-literal / IPv4address / reg-name reg-name = *( unreserved / pct-encoded / sub-delims ) unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
虽然带有下划线的名字并不常见,而且可能违反了一些DNS规则,但它们在实际中确实有效,我们很乐意通过http://、git://或ssh://与它们联系。在URL匹配时忽略它们似乎有些奇怪,尤其是当URL RFC似乎允许它们时。这里不应该有任何缺点,它在URL中不是一个语法上有意义的字符,所以我们不会对解析感到困惑;我们以前会简单地拒绝这样的URL(这里的测试直接检查URL代码,但明显的用户可见效果是无法匹配credential.http://foo_bar.example.com.helper或http.<url>.*中的类似配置)。可以说,我们也希望在这里允许波浪线("~"),这同样可能没有缺点,但我没有添加它,只是因为它看起来更不可能出现在主机名中。
http://
git://
ssh://
credential.http://foo_bar.example.com.helper
http.<url>.*
~
pxiryf3j3#
您可以使用不同的帮助器来完成此操作,例如git-credential-store,它接受一个可选参数作为凭证文件路径,您可以在每个存储库的本地配置中设置此参数,每个存储库使用不同的凭证文件。或者,使用phd注解中the link的建议,这应该适用于Windows的Git凭据管理器。
git-credential-store
tez616oj4#
你不能每个主机(或URI)有多个用户名。据我所知,SSH是最直接的,因为它目前的立场,做你想做的事情。有关详细信息,您可以查看VonC对一个与您的问题非常相似的问题的回答。GitHub: Separate credentials for two accounts on Windows
4条答案
按热度按时间yuvru6vn1#
在URL中添加您的用户名
在Bitbucket上,您可以将用户名添加到远程的HTTPS URL:
https://JerryGoyal@bitbucket.org/path/repo.git
https://bitbucket.org/path/repo.git
由于URL在技术上是不同的,如果你愿意,你可以把你的工作和个人fork都添加为同一个仓库的remote。这项技术在GitHub上也可以使用,但是其他仓库主机可能不支持。
为主机设置
useHttpPath
Git Credential Manager可以根据完整的URL来选择凭证,而不是通过主机名来共享。
credential.useHttpPath
告诉Git在调用凭证提供程序时传递整个仓库URL,而不仅仅是主机名。(这个设置来自Git本身,而不是GCM。)
默认值为
false
。如果您想为 * 完全相同的远程数据库 * 使用不同的远程凭据,则第二种方法不起作用。但是如果您为不同的远程数据库使用不同的URL,则第二种方法应该可以正常工作,即使是从单个本地存储库。
远程主机上的所有资料库
这通常是
useHttpPath
最有用的模式。要为所有Bitbucket远程URL设置该选项,请运行以下命令:Git for Windows支持
useHttpPath
for Azure Repos,您可以在安装位置的etc/gitconfig
中查看它。远程主机上只有一个存储库
正如rjmunro所指出的,你可以去掉
--global
,只使用当前仓库的路径,如果是这样,你也可以去掉主机名:然后,主机的存储库将默认为共享主机凭据,但 * 此 * 存储库将使用完整的URL路径来保存和加载其凭据。
计算机上的所有存储库
从技术上讲,您可以强制自己为 * 每个远程存储库 * 单独添加凭据。这是不必要的冗长,但this answer展示了如何做到这一点:
5jvtdoz22#
更一般地说,您可以使用
credential.useHttpPath
为同一主机运行的多个存储库分割凭证管理。[‡]在这种情况下,请使用Git 2.27(Q2 2020),因为凭据助手的URL解析已经被更正。
参见Jeff King (
peff
)的commit 4c5971e(2020年4月14日)。(由Junio C Hamano --
gitster
--合并至commit a397e9c,2020年4月22日)credential
:将URL中的"?
"和"#
"视为主机末尾签署人:杰夫·金
这是不寻常的看到:
中间没有斜杠,比如
或者甚至:
但是根据RFC 3986,它是主机名(实际上是"权限组件")的有效结尾。
curl
将根据标准解析URL,这意味着它将联系example.com
,但我们的凭据代码将询问其中包含"?
"的虚假主机名。让我们确保遵循标准,更重要的是询问
curl
将与哪些主机通信。如果我们能让curl为我们解析URL就好了,但是它直到7.62才有了URL解析API,所以我们无论如何都要使用后备代码,而且我们需要在Git二进制文件中使用这段代码,我们已经尽力避免在
libcurl
上有链接依赖。但至少我们要修正一下解析器,使用
curl
的解析器可以避免其他潜在的差异,但这会立即缓解已知问题,如果我们最终使用curl
,也会帮助我们的后备代码。随着Git 2.35(Q1 2022)的发布,凭证和其他变量值将受益于最新的RFC 3986:匹配每个URL的配置变量名称时,将下划线(
_
)视为URL中的任何其他URL有效字符。参见Jeff King (
peff
)的commit e4c497a(2021年10月12日)。(由Junio C Hamano --
gitster
--合并至commit 96eca02,2021年11月29日)urlmatch
:将下划线添加到URL_HOST_CHARS
报告人:亚历克斯·韦特
签署人:杰夫·金
当解析一个URL来规范化它时,我们允许主机名只包含点("
.
")或破折号("-
"),加上IPv6文字的括号和冒号。这与RFC 1738中旧的URL标准相匹配,它说:但这后来被RFC 3986更新了,它更自由:
虽然带有下划线的名字并不常见,而且可能违反了一些DNS规则,但它们在实际中确实有效,我们很乐意通过
http://
、git://
或ssh://
与它们联系。在URL匹配时忽略它们似乎有些奇怪,尤其是当URL RFC似乎允许它们时。这里不应该有任何缺点,它在URL中不是一个语法上有意义的字符,所以我们不会对解析感到困惑;我们以前会简单地拒绝这样的URL(这里的测试直接检查URL代码,但明显的用户可见效果是无法匹配
credential.http://foo_bar.example.com.helper
或http.<url>.*
中的类似配置)。可以说,我们也希望在这里允许波浪线("
~
"),这同样可能没有缺点,但我没有添加它,只是因为它看起来更不可能出现在主机名中。pxiryf3j3#
您可以使用不同的帮助器来完成此操作,例如
git-credential-store
,它接受一个可选参数作为凭证文件路径,您可以在每个存储库的本地配置中设置此参数,每个存储库使用不同的凭证文件。或者,使用phd注解中the link的建议,这应该适用于Windows的Git凭据管理器。
tez616oj4#
你不能每个主机(或URI)有多个用户名。据我所知,SSH是最直接的,因为它目前的立场,做你想做的事情。
有关详细信息,您可以查看VonC对一个与您的问题非常相似的问题的回答。GitHub: Separate credentials for two accounts on Windows