git - 仅在需要身份验证时如何将 git 协议从 https 切换到 ssh
问题描述
我正在使用 YubiKey(带有 USB 的 PIV 智能卡)来存储我的 GitHub 的 ssh 凭据。每次通过 ssh 访问 GitHub 时,我都需要插入 key 并放置 pin。这有点压力,如果不需要,我想避免它。例如,在克隆公共存储库时,我不需要通过 https 进行身份验证。
我可以强制 git 客户端在任何地方使用 ssh:
[url "git@github.com:"]
insteadOf = https://github.com/
但我不想到处强制执行 ssh。我只在需要身份验证时才需要它。
有没有人知道好的方法?
解决方案
Git 没有提供本地执行此操作的方法,如果您想将 HTTPS 用于公共存储库,将 SSH 用于私有存储库,则需要手动完成。
这样做的原因是 Git 本质上并不知道两个不同的存储库 URL 映射到同一个存储库。虽然有一些常见的模式,但适用于 GitHub 的方法不适用于我的个人服务器,因此它不能对操作进行任何假设。因此,您必须明确说明您想要什么。
此外,Git 能够知道远程 HTTPS 服务器需要身份验证的唯一方法是尝试发出请求。所以为了完成你想要的,它必须发出一个 HTTP 请求,意识到它得到了一个 401,中止整个单独的 HTTP 帮助程序,回滚,在内部更改协议,然后产生一个全新的进程来做到这一点。不用说,Git 没有这种支持。
正如其他人所建议的那样,您可以将 SSH URL 用于您的私有存储库,并将 HTTPS URL 用于您的公共存储库,并pushInsteadOf
在您~/.gitconfig
的 .
推荐阅读
- r - R中的时间序列图 - 折线图
- android - 区域设置未在发布包中更新
- java - 二维数组是用java定义的吗?如果是,那么输出将是什么?
- google-cloud-platform - 有没有办法计算一段时间内触发警报的数量并在仪表板中可视化?
- python - 我正在尝试检测图像中红色对象的轮廓,但在使用 openCv cv.findContour 函数时不断出现错误
- c# - 如何删除 C# 使用 Interop.Excel 生成的 Excel 数据透视表顶部的“数据”一词?
- javascript - Flask/jinja2/JavaScript/HTML/Bootstrap TypeError:无法读取 null 的属性“classList”
- rust - Cargo 工作空间中具有不同功能的多个版本的本地依赖项 (Rust)
- node.js - Express delete-route 不适用于 Angular 应用程序
- python - sudo apt install python3-pyqt5 和其他 apt install 方法