【Git 学习笔记_27】DIY 实战篇:利用 DeepSeek 实现 GitHub 的 GPG 密钥创建与配置
文章目录
- 1 前言
- 2 准备工作
- 3 具体配置过程
- 3.1. 本地生成 GPG 密钥
- 3.2. 导出 GPG 密钥
- 3.3. 将密钥配置到 Git 中
- 3.4. 测试提交
- 4 问题排查记录
- 5 小结与复盘
1 前言
昨天在更新我的第二个 Vim
专栏《Mastering Vim (2nd Ed.)》时遇到一个经典的 Git
操作问题:如何在 WSL
环境下,将本地已有的 Git
仓库和 GitHub
远程仓库进行关联、并实现同步推送?在尝试传统的 HTTPS
协议推送失败后 1,当时为了节约时间,我改用 SSH
+ RSA
密钥对解决了这个问题。配置结束后,我又看到了曾被多次忽略的 GPG
密钥设置:
【图 1:GitHub 密钥配置页上的 GPG 管理界面】
今天刚好有空就试了下用 DeepSeek
来指导我完成 GPG
密钥的配置,发现实战过程中还是有些坑值得注意。特此梳理并分享出来,让更多后来者少走些弯路。
2 准备工作
操作系统:Windows
自带的 WSL
环境、Ubuntu v20.04
;
Git
:v2.25.1
;
3 具体配置过程
3.1. 本地生成 GPG 密钥
执行以下命令:
$ gpg --full-generate-key
然后根据提示选择密钥类型,这里选择默认的 RSA and RSA
类型:
【图 2:密钥类型选择默认的 “RSA 与 RSA” 型】
接着需要设置密钥长度(keysize),保险起见我填最大的 4096
:
【图 3:密钥长度填最大长度 4096】
然后是设置有效期(默认永久有效,保持默认即可):
【图 4:设置有效期(默认永久有效)】
按回车键后,系统会再次让你确认(毕竟是永久有效,存在潜在安全风险)。输入 y
确认即可:
【图 5:二次确认有效期设置,输入 y 确认即可】
然后根据提示输入登录 GitHub
用到的用户名与绑定邮箱(注意邮箱一定不能写错,否则后期匹配不上):
【图 6:根据提示输入帐号、邮箱、描述信息(非必填),然后确认】
然后系统会提示你输入一个 passphrase
,也就是安全密码,输入完毕按回车键确认,就会看到如下界面,GPG
密钥就生成好了:
【图 7:成功生成本地 GPG 密钥对后的提示界面】
3.2. 导出 GPG 密钥
先获取刚生成的 GPG 密钥 ID:
$ gpg --list-keys
从给出的密钥信息列表中复制密钥 ID:
【图 8:获取 GPG 密钥 ID 信息(红框选中部分)】
接着输入下列命令,将密钥 ID 代入:
$ gpg --armor --export <YOUR_GPG_KEYS_ID>
-----BEGIN PGP PUBLIC KEY BLOCK-----mQINBGe6+CABEADVglzi0o4M1MdL+qH/l8S5hCt1OZJkH5QJwdgh1UjTrcD7exy7
...
1WFAIhz8gD/aM7BpipjxAPja7tp5HkKoRHi7OHEg1iVL+Kkgg5a6p2+psluI1MqG
5fMAIYTk0g4OFjYpMooTzA==
=Vqrv
-----END PGP PUBLIC KEY BLOCK-----
$
再将 -----BEGIN PGP PUBLIC KEY BLOCK-----
和 -----END PGP PUBLIC KEY BLOCK-----
之间(包含边界)的文本内容复制到 GitHub
配置页面:
【图 9:将导出的公钥信息存入 GitHub 配置页面】
3.3. 将密钥配置到 Git 中
执行以下命令完成 Git
的配置:
$ git config --global user.signingkey <YOUR_KEY_ID>
$ git config --global commit.gpgsign true
3.4. 测试提交
配置成功后,就可以实际测一下代码的提交和推送了:
【图 10:实测 GPG 密钥配置成功后的 commit 提交,需输入正确的安全密码】
然后再试试推送到 GitHub
:
【图 11:本地提交成功后,将 commit 节点推送至 GitHub】
再到 GitHub
检查推送的 commit
节点,可以看到经过签名的本地提交都自带 Verified
校验标记:
【图 12:在 GitHub 官网看到的已通过 GPG 签名校验的本地推送版本】
4 问题排查记录
首次配置其实并没有这么顺利,完成 Git
的配置后提交一个本地 commit
就失败了:
$ git commit -m 'Test'
error: gpg failed to sign the data
fatal: failed to write commit object
将报错信息直接提给 DeepSeek
,根据提供的报错原因逐一排查,最后发现是 GPG
默认的用于输入密码的 pinentry
程序没有配置。配置方法:打开或新建 GPG
配置文件 ~/.gnupg/gpg.conf
,并输入以下内容:
pinentry-mode loopback
然后打开或新建另一个配置文件 ~/.gnupg/gpg-agent.conf
,输入以下内容:
allow-loopback-pinentry
然后重启 GPG
代理:
$ gpg-connect-agent reloadagent /bye
OK
$
再次提交就能自动弹出提示,让你输入安全密码了。
以下为 DeepSeek
提供的问题原因排查流程(摘要):
【图 13:DeepSeek 给出的问题排查清单,逐一验证到第四条时找到真正原因】
此外,如果不将 loopback
模式配到 GPG
的配置文件中,还可以用以下命令进行测试:
$ echo "test" | gpg --clearsign
运行命令时会提示输密码,通过校验就会看到一串签名内容:
【图 14:实测命令 gpg --clearsign 来反馈 GPG 签名是否配置成功】
这样虽然简单些,但每次提交都得用上述命令检查一遍,效率其实并不高。
5 小结与复盘
本次和 DeepSeek
的互动没有开启推理模式,并且只在首次配置报错后才启用联网模式,实测下来效果依旧很好。由于 GPG
的本地配置之前并没有做过功课,所以也无法从提示词层面将问题描述得很精确;此时,应该果断放弃一步到位的想法,按照提供的思路进行实践,并将中途发生的异常如实提交给 DeepSeek
。这比之前用谷歌百度搜索快太多了。
同时还应该注意,解决完问题后应该通读一遍和 DeepSeek
的完整对话,对配置过程中遇到的问题进行梳理复盘,主动从尝试中学习新知识。如果时间允许,还可以和 GitHub
官方公布的配置文档进行对比,找出两者的差异,在反复对比中加深印象。
正如 DeepSeek
无法一次性获知 GPG
配置时的具体环境,我们也不可能在 AI 工具的辅助下一步到位学会 GPG 的正确配置;但我们一定要保持清醒,从每次实际训练中主动完善自己的知识结构(本篇梳理也是基于这个目的)。这样才能掌握人的主动权。
为什么要特别强调这一点呢?因为最近很多朋友跟我反馈,他们在面对铺天盖地的科技新闻轰炸时,表现出的更多是深深的焦虑:AI 什么都能做了,人还做什么?我其实挺理解这种心情的,当前大家面临的困境也是前所未有的:明明知道 AI 很强大,但真正想要去了解 AI 的时候却感觉特别无力——门槛太高、众说纷纭、鱼龙混杂、泥沙俱下……过去面对一个未知领域,人们似乎还能认准大方向,也相信自己一定能弄明白;而时至今日,很多过去的美德和品质正在被 AI 的飞速发展慢慢解构:还有必要去钻研知识吗?会不会高不容易搞懂的操作和概念转眼间又被新的 AI 成果所取代?
这些问题目前都是无解的,或者只能说“都有可能”。毕竟我们经历了太长时间的缓慢积累与艰难探索,早已习惯了确定的答案和确定的道路。面对突如其来的 AI 巨变,每个人心中都对这个很可能全面超越人类的新事物心存忌惮。这种感觉,颇有点类似《超体》中女主 Lucy 第一次和 Samuel Norman 教授通话时,双方几乎同时表现出的迷茫和困顿的那一幕。但我认为,人还是不能沉湎于这样的迷茫的,而是坦然接受未来的不确定性,并且尽一切可能守护好自己的主观能动性。AI 越是强大,越不能在它面前缴械投降,而应该时刻保持主动地、深度地思考的习惯。
出于安全考虑,
GitHub
官方已于 2021 年 8 月起禁止使用基于HTTPS
协议的用户名/密码校验来推送Git
代码库。 ↩︎
相关文章:

【Git 学习笔记_27】DIY 实战篇:利用 DeepSeek 实现 GitHub 的 GPG 密钥创建与配置
文章目录 1 前言2 准备工作3 具体配置过程3.1. 本地生成 GPG 密钥3.2. 导出 GPG 密钥3.3. 将密钥配置到 Git 中3.4. 测试提交 4 问题排查记录5 小结与复盘 1 前言 昨天在更新我的第二个 Vim 专栏《Mastering Vim (2nd Ed.)》时遇到一个经典的 Git 操作问题:如何在 …...
微信小程序地图map全方位解析
微信小程序地图map全方位解析 微信小程序的 <map> 组件是一个功能强大的工具,可以实现地图展示、定位、标注、路径规划等多种功能。以下是全方位解析微信小程序地图组件的知识点: 一、地图组件基础 1. 引入 <map> 组件 在页面的 .wxml 文…...
调试无痛入手
在调试过程中,Step In、Step Over 和 Step Out 是控制代码执行流程的常用操作,帮助开发者逐行或逐块检查代码行为。以下是它们的详细介绍及使用方法: 1. Step In 功能:进入当前行的函数或方法内部,逐行执行其代码。使…...
【蓝桥杯集训·每日一题2025】 AcWing 6135. 奶牛体检 python
6135. 奶牛体检 Week 1 2月21日 农夫约翰的 N N N 头奶牛站成一行,奶牛 1 1 1 在队伍的最前面,奶牛 N N N 在队伍的最后面。 农夫约翰的奶牛也有许多不同的品种。 他用从 1 1 1 到 N N N 的整数来表示每一品种。 队伍从前到后第 i i i 头奶牛的…...
AI发展迅速,是否还有学习前端的必要性?
今天有个小伙伴跟我讨论:“现在 AI 发展迅速,是否还有学习 JS 或者 TS 及前端知识的必要?” 我非常肯定地说: 是的,学习 JavaScript/TypeScript 以及前端知识仍然非常必要,而且在可预见的未来,…...

【数据标准】数据标准化是数据治理的基础
导读:数据标准化是数据治理的基石,它通过统一数据格式、编码、命名与语义等,全方位提升数据质量,确保准确性、完整性与一致性,从源头上杜绝错误与冲突。这不仅打破部门及系统间的数据壁垒,极大促进数据共享…...

VS2022配置FFMPEG库基础教程
1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年,由法国工程师Fabrice Bellard主导开发,其名称源自"Fast Forward MPEG",初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护,逐步发展成为包含音视频采…...

three.js之特殊材质效果
*案例42 创建一个透明的立方体 <template><div ref"container" className"container"></div> </template><script setup> import * as THREE from three; import WebGL from three/examples/jsm/capabilities/WebGL.js // 引…...

Qt常用控件之日历QCalendarWidget
日历QCalendarWidget QCalendarWidget 是一个日历控件。 QCalendarWidget属性 属性说明selectDate当前选中日期。minimumDate最小日期。maximumDate最大日期。firstDayOfWeek设置每周的第一天是周几(影响日历的第一列是周几)。gridVisible是否显示日历…...

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体
vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体,当输入的值为负数时,会自动显示红色字体,对于数值或者金额输入时该功能就非常有用了。 查看官网:https://vxetable.cn gitbub:https://github.co…...

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖
最近是接了一个需求咨询图像处理类的,甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全, 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件,能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…...

算法日记27:完全背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)
一、暴力搜索(DFS) O ( n 2 ) O(n^2) O(n2) 1.1)思路解析 1、注意和01背包的区别在于每个物品可以无限次选择 注意在完全背包中,当一个物品被选择过一次,我们仍然需要考虑是否继续选择这个物品 01背包: …...
Linux 命令大全完整版(14)
5. 文件管理命令 chgrp(change group) 功能说明:变更文件或目录的所属群组。语 法:chgrp [-cfhRv][–help][–version][所属群组][文件或目录…] 或 chgrp [-cfhRv][–help][–version][–reference<参考文件或目录>][文件或目录…]补充说明&…...

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知
写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 😃,生活加油 我站在人潮中央,思考这日日重复的生活。我突然想,…...
Could not initialize class io.netty.util.internal.Platfor...
异常信息: Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...

【书生大模型实战营】玩转HF/魔搭/魔乐社区-L0G4000
本文是书生大模型实战营系列的第4篇,本文的主题是:玩转HF/魔搭/魔乐社区。 1.开源大模型社区总览 开源不仅仅是一种技术模式,更是一种精神的体现。它打破了知识的壁垒,让技术平权成为可能。近年来,开源大模型社区蓬勃…...
2025年华为手机解锁BL的方法
注:本文是我用老机型测试的,新机型可能不适用 背景 华为官方已经在2018年关闭了申请BL解锁码的通道,所以华为手机已经无法通过官方获取解锁码。最近翻出了一部家里的老手机华为畅玩5X,想着能不能刷个系统玩玩,但是卡…...

了解 RAG 第二部分:经典 RAG 的工作原理
在本系列的第一篇文章中,我们介绍了检索增强生成 (RAG) ,解释了扩展传统大型语言模型 (LLM)功能的必要性。我们还简要概述了 RAG 的核心思想:从外部知识库检索上下文相关的信息,以确保 LLM 生成准确且最新的信息,而不会…...
50周学习go语言:第四周 函数与错误处理深度解析
第四周 函数与错误处理深度解析 以下是第4周函数基础的深度教程,包含两个完整案例和详细实现细节: 第四周:函数与错误处理深度解析 一、函数定义与参数传递 1. 基础函数结构 // 基本语法 func 函数名(参数列表) 返回值类型 {// 函数体 }// …...
debian 12安装 postgresql 17
按照官方文档安装,即可安装成功 https://www.postgresql.org/download/linux/debian/ 添加存储库 #添加存储库 sudo apt install -y postgresql-common#执行 存储库内 命令,自动处理某些东西 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.o…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...