如何禁用单个仓库的git凭证助手?

vmdwslir  于 2023-05-15  发布在  Git
关注(0)|答案(5)|浏览(139)

如果我在~/.gitconfig中设置了一个凭证帮助程序,我如何在特定的存储库中禁用/绕过它并使用 no 凭证帮助程序?
我尝试编辑repo的.git/config文件,以清空credential.helper属性,如下所示:

[credential]
    helper =

...但是当我执行git push时,我得到以下错误消息,并且Git无论如何都使用了来自~/.gitconfig的默认凭证助手:

git: 'credential-' is not a git command. See 'git --help'.

Did you mean this?
        credential

我使用的是Git版本1.7.12。
(背景故事/用例:Git被配置为使用store helper,它将密码以未加密的方式存储在磁盘上。cache帮助程序在此系统上不可用。我有几个仓库,我宁愿每次都输入密码,而不是把它保存在磁盘上。)

fcipmucu

fcipmucu1#

在git 2.9(2016年6月)中,这个(helper =)可以正常工作!
credential.helper配置变量是累积的,没有好的方法从命令行覆盖它。
作为一种特殊情况,给出一个空字符串作为其值,现在用作清除各种文件中指定值的信号
参见commit 2432137(2016年2月26日),作者Jeff King ( peff )
(由Junio C Hamano -- gitster --合并至commit 1b68962,2016年4月3日)

credential:允许空凭据规范重置帮助程序列表

由于credential.helper键是一个多值配置列表,因此一旦设置了helper,就没有办法“取消设置”。因此,如果您的系统/etc/gitconfig设置了一个,您永远无法避免运行它,而只能在顶部添加您自己的帮助程序。
由于credential.helper的空值是无意义的(它只会尝试运行“git-credential-”),我们可以假设没有人使用它。让我们定义它来重置helper列表,让您覆盖之前出现的低优先级示例。
更方便:在Git 2.26(2020年第一季度)中,此覆盖甚至适用于任何值。
参见commit 46fd7b3commit 82eb249commit 588c70ecommit 732f934commit 3fa0e04(2020年2月20日)by brian m. carlson (``)
(由Junio C Hamano -- gitster --合并于commit 2cbb058,2020年3月5日)

credential:使用配置中最后一个匹配的用户名

签字人:布赖恩·卡尔森
在代码库的其他地方,我们使用最后一个匹配的配置选项是生效的配置选项的规则。
这是有帮助的,因为它允许更具体的配置设置(例如,每存储库配置)覆盖不太具体的设置(例如,每用户配置)。

然而,在凭证代码中,我们没有荣誉此设置,而是选择了我们拥有的第一个设置,并坚持使用它

这很可能确保我们从URL中选择了值,我们希望在配置中荣誉该值。
但是,这两种方法都是可能的,所以让我们检查该值是否是我们通过协议连接获得的值,如果存在,则将来自URL,如果是,则保留它。
否则,让我们用从配置中获得的最新版本覆盖该值,因此我们保留最后一个配置值。
注:user202729在评论中添加:
如果凭证助手A设置为全局,并且您希望在 * 本地 * 存储库中使用B(* 更改 *,而不是删除助手),请用途:

git config --local credential.helper ''
git config --local --add credential.helper B

第一个空项删除全局设置A
同样,在.git/config中设置两条线helper =helper = B

eoigrqb6

eoigrqb62#

我尝试过的,而且效果很好的是:

$ git config --system --unset credential.helper

但为了让它正常工作,我必须设置git-bash.exe的管理员权限。
不幸的是,我认为这是一个全局变量。您应该测试并查看它是否适用于单个存储库。
祝你好运

6rqinv9w

6rqinv9w3#

除了I mention above with Git 2.9的'git config credential.helper='之外,你现在(Git 2.13.x/Git 2.14,2017年第3季度)可以仅为一个 * 命令 * 禁用凭证助手(而不仅仅是给定存储库中的任何命令)
这意味着git -c credential.helper= clone /url/remote/repo现在可以工作了。
git clone --config var=val“是一种填充新仓库的每仓库配置文件的方法,但是当瓦尔是空字符串时,它不能很好地工作
已修复此问题。
参见commit db4eca1(2017年5月2日),作者Jonathan Nieder ( artagnon )
(由Junio C Hamano -- gitster --合并于commit 883247c,2017年5月16日)

clone:处理-c中的空配置值

git clone --config“使用以下命令向配置文件添加一个项,而不是替换现有值:

git_config_set_multivar_gently(key, value, "^$", 0)

只要没有现有值与regex ^$匹配,就可以按预期工作并添加到配置中。但是,当值为空时,它将替换现有值。
在克隆期间尝试设置credential.helper以使用特定的帮助程序而不从~/.gitconfig/etc/gitconfig继承时注意到。
那就是,我跑了:

git clone -c credential.helper= \
     -c credential.helper=myhelper \
     https://example.com/repo

旨在生产该配置:

[credential]
     helper =
     helper = myhelper

如果没有此补丁,则不包括'helper ='行,并使用来自/etc/gitconfig的凭据帮助程序。
请注意,使用commit 515360f时,文档现在更清晰:
凭证文档:使多助手行为更加突出
Git的配置系统通过按顺序阅读多个配置文件来工作,从一般到特定:

  • 一、系统配置/etc/gitconfig
  • 然后用户的配置(~/.gitconfig~/.config/git/config
  • 然后是存储库配置(.git/config

对于单值配置项,最新值获胜。
对于多值配置项,值按该顺序累积。
例如,这允许在~/.gitconfig中全局设置一个凭证助手,git将尝试在所有存储库中使用,无论它们是否额外提供另一个助手。
这通常是件好事。我可以安装帮助程序来使用我的操作系统密钥链,并在短时间内全局缓存凭据。
有时人们希望能够覆盖继承的设置。

对于credential.helper的设置,可以先将配置项设置为空,然后再赋予新值

2w3kk1z5

2w3kk1z54#

设置为空字符串的配置变量与未设置的变量不同。当一个变量已经在~/.gitconfig中被设置时,不可能在.git/config中强制取消设置。
此外,credential.helper是使用多个值的变量之一,在这种情况下,这些值是从所有读取的配置文件中聚合的。
所以基本上你的选择似乎是:

  • ~/.gitconfig中不使用credential.helper;只为你想要的仓库设置store helper,在.git/config中,或者在~/.gitconfig中,通过指定仓库URL,例如。
[credential "https://specific.example.com/repo.git"]
helper = store
  • 或者实现您自己的helper,它对一组已配置的存储库不做任何事情,并将其余的工作委托给git credential-store
50few1ms

50few1ms5#

我也遇到了这个问题,因为当我想测试一个新的credential.helper时,我配置的第一个credential.helper总是在执行。这是在macOS上使用苹果开发工具提供的git。
使用git config --list列出配置显示了两个助手。
运行git config --global --edit没有显示第一个帮助器的设置。有点奇怪的是,配置helper时的--global与编辑配置时的--global的作用域不同。
另外,因为我想包括一个不同的助手,只是空白出来是不会解决它。
最后在两个地方找到了设置:

  • /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
  • /Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig

从第一个设置中删除了credential部分,但这两个设置仍然使用--list列出。在重新启动并尝试了unset、unset-all --system、--global、et的每一个组合之后,我找到了第二个文件。
从该文件中删除了设置(同样只有一个),最后--list没有显示任何配置的帮助程序。

相关问题