如何在Git Credential Manager for Windows中存储每个存储库的凭据?

bnl4lu3b  于 2023-02-28  发布在  Git
关注(0)|答案(4)|浏览(194)

我有两个GitHub帐户,工作帐户和个人帐户,我想在Windows 10中安全地存储它们的凭据。
git config --global credential.helper manager只设置了一个用户名和密码,这在我个人帐户的存储库和工作帐户的存储库之间产生了冲突。两个存储库都是使用HTTPS克隆的。
我想存储和访问不同的凭证,可能基于仓库用户名。可以吗?
我知道SSH是一个选项,但我想知道如何为HTTPS做这件事。

yuvru6vn

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 config --global credential.https://bitbucket.org.useHttpPath true

Git for Windows支持useHttpPath for Azure Repos,您可以在安装位置的etc/gitconfig中查看它。

[credential "https://dev.azure.com"]
    useHttpPath = true

远程主机上只有一个存储库

正如rjmunro所指出的,你可以去掉--global,只使用当前仓库的路径,如果是这样,你也可以去掉主机名:

git config credential.useHttpPath true

然后,主机的存储库将默认为共享主机凭据,但 * 此 * 存储库将使用完整的URL路径来保存和加载其凭据。

计算机上的所有存储库

从技术上讲,您可以强制自己为 * 每个远程存储库 * 单独添加凭据。这是不必要的冗长,但this answer展示了如何做到这一点:

git config --global credential.useHttpPath true
5jvtdoz2

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中的"?"和"#"视为主机末尾

签署人:杰夫·金
这是不寻常的看到:

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日)

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.helperhttp.<url>.*中的类似配置)。
可以说,我们也希望在这里允许波浪线("~"),这同样可能没有缺点,但我没有添加它,只是因为它看起来更不可能出现在主机名中。

pxiryf3j

pxiryf3j3#

您可以使用不同的帮助器来完成此操作,例如git-credential-store,它接受一个可选参数作为凭证文件路径,您可以在每个存储库的本地配置中设置此参数,每个存储库使用不同的凭证文件。
或者,使用phd注解中the link的建议,这应该适用于Windows的Git凭据管理器。

tez616oj

tez616oj4#

不能每个主机(或URI)有多个用户名。据我所知,SSH是最直接的,因为它目前的立场,做你想做的事情。
有关详细信息,您可以查看VonC对一个与您的问题非常相似的问题的回答。GitHub: Separate credentials for two accounts on Windows

相关问题