目录

Gerrit报错Permission-denied-publickey的解决办法

Gerrit报错:Permission denied publickey的解决办法

如何解决问题在最后

一、核心定位

Gerrit 是一款 开源的代码审查与项目管理工具 ,深度集成 Git 版本控制系统,专为团队协作设计。最初由 Google 开发(源于 Android 项目),现广泛应用于开源项目(如 Linux 内核)和企业级开发,核心目标是 在代码合并前通过审查提升质量 ,同时支持灵活的工作流程。

二、核心功能与特性
  1. 代码审查流程

    • Change 与 Patch Set :每个提交(Change)包含唯一的 Change-Id (由克隆时自动添加的 commit-msg 钩子生成),支持多次迭代(Patch Set),最终仅合并最新版本。
    • Web 界面交互 :通过网页实时查看代码差异、添加行内注释,支持审查者评分(如 +2 代表批准, -2 阻止合并),所有讨论历史可追溯。
    • 自动化验证 :集成 CI/CD 工具(如 Jenkins),自动运行测试并标记 “Verified” 状态,确保代码质量。
  2. Git 深度集成

    • 特殊引用(Refs) :通过 refs/for/<分支名> 推送代码至审查暂存区,区别于直接提交到主分支( refs/heads ),强制审查流程。
    • 权限精细化 :支持按项目、分支、用户角色配置权限(如提交、审查、合并),甚至允许部分用户绕过审查直接提交。
  3. 协作与透明度

    • 关联工作项 :与飞书、Jira 等工具集成,将代码变更关联需求 / 缺陷,自动同步状态(如合并后更新任务节点)。
    • 通知机制 :通过邮件或 Webhook 实时通知关注者,支持 Watch 项目 / 分支,减少沟通成本。
三、典型工作流程
  1. 克隆代码(含钩子)

    git clone ssh://user@gerrit-server:29418/project && scp -p -P 29418 user@gerrit-server:hooks/commit-msg .git/hooks/

    注: commit-msg 钩子自动生成 Change-Id ,确保多版本提交关联。

提交审查

git commit -m "feat: 新功能"  # 钩子自动添加 Change-Id
git push origin HEAD:refs/for/master  # 推送到审查分支
  1. 审查与迭代

    • 审查者通过 Web 界面评论、打分,提交者根据反馈修改后 --amend 并重新推送,自动覆盖旧 Patch Set。
    • 需至少一个 +2 评分且无 −2 ,同时通过自动化测试(Verified +1),方可合并。
  2. 合并与同步

    审查通过后,Gerrit 将代码合并至目标分支,自动清理暂存区,本地通过 git pull --rebase 同步最新代码。

四、为什么选择 Gerrit?
  • 质量保障 :强制审查机制减少低质量代码提交,历史讨论可追溯,便于知识沉淀。
  • 灵活适配 :支持私有化部署(如内网环境),兼容 HTTPS 与 SSH,适配不同团队规模。
  • 效率提升 :与 Git 无缝衔接,快捷键(如 Ctrl+Enter 提交评论)和 REST API 优化开发体验,支持分端(前后端)流转规则。
  • 生态集成 :与飞书、Jenkins 等工具深度联动,实现 “代码提交→审查→测试→部署” 全流程自动化。
五、技术与生态
  • 底层架构 :基于 Java 和 Git,早期版本用 Python,现支持 MySQL/PostgreSQL 存储元数据。
  • 钩子扩展 :通过 commit-msgpre-receive 等钩子自定义逻辑(如规范提交信息)。
  • 适用场景 :适合需要严格代码审查的团队(如大型开源项目、金融 / 医疗等高风险领域),或希望标准化协作流程的企业。
总结

Gerrit 不仅是代码审查工具,更是 团队协作的规范引擎 。通过强制审查、透明讨论和自动化集成,它帮助团队在快速迭代中保持代码质量,尤其适合对质量敏感、需追溯变更的项目。无论是克隆时的钩子配置,还是审查中的评分机制,其设计处处体现 “让审查成为开发习惯” 的理念。

问题 :在使用Gerrit clone代码的时候,你会发现报错,错误信息大概是:Permission denied (publickey)。

原因
OpenSSH从8.8版本开始由于安全原因开始弃用了rsa加密的密钥。

因为OpenSSH认为rsa破解成本太小了,有风险就给禁用了。

你可以通过命令:

ssh -v [git服务器]

去查看Gerrit服务器的OpenSSH的版本号,

如果≥8.8,就可以用这个方法。

解决办法

进入本机 .ssh目录,

在下面新建一个config文件,不带后缀名:

https://i-blog.csdnimg.cn/direct/9e163b4a8a6e4b53900cec73137b64a3.png 文件里我的内容:

https://i-blog.csdnimg.cn/direct/398ba7d617a84643a11a5abf24cf66e1.png

文字版本

Host gerrit的IP或者域名
HostName gerrit的IP或者域名
User Gerrit的用户名(例如:zhangsan)
PubkeyAcceptedKeyTypes +ssh-rsa
IdentityFile ~/.ssh/id_rsa
Port 29418(Gerrit端口)

配置好后重新打开终端拉取代码即可成功