vault backup: 2026-07-01 23:09:21

This commit is contained in:
2026-07-01 23:09:21 +08:00
parent 0fca751850
commit a5e418c701
8 changed files with 1380 additions and 0 deletions
@@ -0,0 +1,128 @@
---
tags: [git, ssh, dev-env]
create time: 2026-07-01 00:00
---
# Git & SSH 配置
## 概述
Git 本地配置、SSH Key 管理与多账户/多主机路由,确保 GitHub 与私有 Gitea 实例能同时免密协作。核心在于 `~/.ssh/config` 文件将不同主机映射到独立的私钥。
## 核心概念
### Git 全局配置项速览
```bash
git config --global user.name "hezhaohui"
git config --global user.email "hezhaohui0807@163.com"
git config --global core.autocrlf input # 写时转 LF,避免 Windows CRLF 混入仓库
git config --global init.defaultBranch main # 初始化用 main(不再过时默认的 master)
git config --global init.forcedCloneProtocol https # git clone 默认走 HTTPS(可选)
```
> [!info] 查看 / 删除配置
> - `git config --global --list` — 列出所有全局设置
> - `git config --global --unset user.name` — 删除某项
> - `git config --edit --global` — 直接编辑 `~/.gitconfig`
### SSH Key 为什么需要独立密钥对
同一个 GitHub / Gitea 账号如果共用一个 SSH Key 是可以的,但 **按服务分 key** 有以下好处:
| 优势 | 说明 |
|------|------|
| 隔离风险 | Gitea 服务器如果泄露某个部署密钥(deploy key),不会牵连你的 GitHub 主身份 |
| 审计清晰 | 服务端日志中 `Host A uses id_ed25519_github` vs `id_ed25519_gitea`,一眼区分来源 |
| 灵活轮换 | 替换 Gitea 密钥不影响 GitHub 已授权的 session |
### ~/.ssh/config 路由机制
SSH 客户端在发起连接时会顺序读取 `~/.ssh/config`,**第一个匹配规则生效**。关键指令:
| 指令 | 作用 |
|------|------|
| `Host` | 别名(不是真实主机名),匹配 `.git@remote-url` 中的 hostname 部分 |
| `HostName` | 真实 DNS 名或 IP |
| `Port` | SSH 端口(默认 22) |
| `User` | SSH 认证用户名 |
| `IdentityFile` | 使用的私钥路径 |
| `IdentitiesOnly yes` | 强制只使用指定 key,不尝试系统其他 key |
示例完整配置:
```ssh-config
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
Host gitea-self
HostName 47.121.181.112
Port 3000
User git
IdentityFile ~/.ssh/id_ed25519_gitea
IdentitiesOnly yes
```
连接测试验证:
```bash
ssh -T git@github.com # Hi hezhaohui! You've successfully authenticated...
ssh -T git@gitea-self # logged in as hezhaohui
```
> [!tip] verbose 调试
> 遇到 "Permission denied" 时加 `-v` 打印详细握手日志:
> ```bash
> ssh -Tv git@github.com 2>&1 | grep "Offering"
> # 看客户端主动发送了哪个 key、服务端拒绝了哪一个
> ```
## 常见陷阱与最佳实践
### 1. SSH Config Host 别名必须与实际 URL 一致
```bash
# ❌ 错误:.git 远端仍指向原始地址
git remote add origin git@47.121.181.112:3000/user/repo.git
# ✅ 正确:使用 alias,让 config 中的 Host 匹配
git remote add origin git@gitea-self:3000/user/repo.git
```
Git 克隆时的远程 URL 格式为 `git@[Host]:path`,`Host` 必须和 `~/.ssh/config` 里的 `Host` 完全一致才会命中对应的 IdentityFile 规则。
### 2. Git 的 HTTP 代理干扰 SSH
如果你设置了 `http.proxy` 或 `https.proxy`,某些工具链可能影响 `ssh` 命令的网络行为。对于 SSH 专用代理(如 proxychains),要排除内网地址:
```bash
# .gitconfig 中排除 Gitea 内网段
[url "ssh://git@gitea-self:3000/"]
insteadOf = ssh://git@47.121.181.112:3000/
```
### 3. 私钥权限过松导致被拒绝
```bash
chmod 600 ~/.ssh/id_ed25519_gitea
chmod 600 ~/.ssh/config # SSH client 也要求 config 不能开放可读
```
OpenSSH 如果检测到私钥文件对其他用户可读写,会直接忽略它——这是最常见的新手踩坑。
### 4. Ed25519 vs RSA:优先用 Ed25519
| 算法 | 公钥长度 | 私钥长度 | 安全性 | 速度 |
|------|---------|---------|--------|------|
| **Ed25519** ✅ | 68 bytes | 68 bytes | 高 | 快 |
| RSA 4096 | 968 bytes | ~3 KB | 中高 | 慢 |
Ed25519 不受 Heartbleed 类漏洞影响,且密钥更小、签名更快。除非服务端明确限制(极老设备),否则一律用 ed25519。
## 延伸阅读
- [[mac-dev-env-setup/homebrew-intro]] — Homebrew 包管理器安装 Git
- [[mac-dev-env-setup/node-nvm-pnpm]] — Node.js 环境搭建(后续依赖)