ssh 公私钥与github相关配置
生成自定义名称的SSH公钥和私钥对,需要使用ssh-keygen命令,这是大多数Linux和Unix系统自带的标准工具。下面,我会向你展示如何使用ssh-keygen命令来生成具有自定义名称的SSH密钥对。
目录
三、尝试向GitHub推送代码时收到"Permission denied (publickey)"错误
1) SSH agent 错误, 出现在windows wsl 环境
2) ssh -T git@github.com 仍登录失败
五、git 上传忽略一些文件的 .gitignore 文件项目根目录创建 .gitignore 文件, 格式如下
一、生成ssh公私钥
生成自定义名称的SSH公钥和私钥对,需要使用ssh-keygen命令,这是大多数Linux和Unix系统自带的标准工具。下面,简单展示如何使用ssh-keygen命令来生成具有自定义名称的SSH密钥对。
步骤 1: 打开终端
首先,打开我们的终端(或命令提示符)。在Windows上,我们可能需要使用PuTTYgen或者通过Git Bash来执行相似的命令,但这个指南将关注标准的Unix-like环境。
步骤 2: 生成密钥对
接下来,使用以下命令生成一个新的SSH密钥对。这里,
your_custom_name应该被替换为我们想要用于密钥文件的名称。不要加.pub或者任何其它的后缀,因为ssh-keygen会自动为公钥文件添加.pub后缀。ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/your_custom_name这条命令中的参数说明如下:
-t rsa: 指定密钥类型,这里是RSA。-b 4096: 指定密钥的位数,这里是4096位,当前推荐的安全长度。-C "your_email@example.com": 添加一个注释(通常是电子邮件地址)到密钥中。这对于识别用途在哪、属于谁很有帮助。-f ~/.ssh/your_custom_name: 指定生成密钥的路径和文件名。这里~/.ssh/是SSH目录的标准位置,your_custom_name是你的自定义文件名。步骤 3: 输入密码(可选)
在执行命令后,系统可能会提示我们输入一个密码(passphrase)。这一步是可选的,但是推荐我们为密钥对设置一个密码以增加安全性。如果不想设置密码,直接按回车键跳过。
步骤 4: 验证生成的密钥
生成密钥对后,我们可以通过列出
~/.ssh目录的内容来验证它们是否成功创建:ls ~/.ssh应该看到我们的自定义文件名和同名的.pub文件,例如:
your_custom_name your_custom_name.pub
your_custom_name是私钥文件,而your_custom_name.pub是公钥文件。步骤 5: 使用SSH密钥
现在我们已经有了自定义命名的SSH密钥对,可以开始使用它们了。例如,我们可以把公钥(
.pub文件)添加到想要通过SSH连接的服务器上的~/.ssh/authorized_keys文件中,从而实现无密码登录。这样,我们就成功生成了一个自定义命名的SSH密钥对。确保保管好私钥,并且只将公钥共享给需要它的服务或个人。
二、 git 上传项目
参考链接:用git上传项目到GitHub(图文并茂,这一篇就够了)
首先在github官网上创建一个项目仓库,创建完成后github会给出初始化本地项目目录的命令用于后续上传,例如:
上述的命令略作修改如下:
# 将上面 git add REAME.md 改成 git add . # 其他命令一样 git add .
三、尝试向GitHub推送代码时收到"Permission denied (publickey)"错误
当在尝试向GitHub推送代码时收到"Permission denied (publickey)"错误,意味着GitHub无法通过公钥认证的SSH连接。这个问题通常由以下几个原因引起:
- 未将SSH公钥添加到GitHub账户:GitHub需要公钥来验证身份。
- SSH密钥没有加载到SSH代理:即使有一个SSH公钥,它也需要被SSH代理加载。
- SSH配置问题:有时候SSH配置不正确也会导致这个问题。
按以下步骤来解决这个问题:
步骤 1: 确认SSH公钥已添加到GitHub
在你的电脑上打开终端,使用
cat命令查看你的公钥内容。假设密钥名称为id_rsa.pub,运行:cat ~/.ssh/id_rsa.pub如果使用的是其他名称,请相应地替换文件名。
登录到GitHub账户,进入Settings > SSH and GPG keys。
点击New SSH key 按钮,将公钥(步骤1中显示的内容)粘贴到框中,并保存。
步骤 2: 确认SSH密钥已加载到SSH代理
运行
ssh-add -l查看已加载的密钥。如果密钥已加载,这个命令将列出它们。ssh-add -l如果你的密钥没有被列出,使用
ssh-add ~/.ssh/id_rsa来添加它。如果你使用的是自定义名称,确保正确地替换了路径和文件名。ssh-add ~/.ssh/custom_id_rsa # 我的系统是mac os,SSH agent 在一段时间后自动清除了添加的密钥,换句话来说上面的命令添加是临时的,下面有两种解决方案 1. ssh-add -t 12h ~/.ssh/custom_id_rsa # 这会将密钥添加到 SSH agent 并保持 12 小时。 2. ssh-add -K ~/.ssh/custom_id_rsa # 将密钥永久添加到 SSH agent ssh-add --apple-use-keychain ~/.ssh/custom_id_rsa # 在较新的 macOS 版本中,-K 选项可能已被弃用,你可能需要使用 --apple-use-keychain 选项代替。步骤 3: 尝试SSH到GitHub
运行以下命令来测试你的SSH连接到GitHub:
ssh -T git@github.com如果连接成功,你将看到一条欢迎信息。这表示SSH设置正确。
步骤 4: 再次尝试git操作
在确认SSH设置无误后,再次尝试执行你的git命令:
git push -u origin main # 或 master等
怎么删除之前添加的一些无效的SSH代理呢?
删除之前add的无效SSH代理的方式
假设之前添加了几个不同的密钥到SSH代理,现在想删除它们:
查看已加载的密钥:
ssh-add -l删除特定的密钥(例如:
~/.ssh/custom_key):ssh-add -d ~/.ssh/custom_key删除所有的密钥:
ssh-add -D
一些其他的错误:
1) SSH agent 错误, 出现在windows wsl 环境
(base) shayuer@DESKTOP-SHAYUER:~/.ssh$ ssh-add -l
Could not open a connection to your authentication agent.
解决思路:
1. 这个错误通常表明 SSH agent 没有运行或者没有正确设置。
检查 SSH agent 是否正在运行:
```bash
ps aux | grep ssh-agent
```
2. 以下是解决方案:
# 安装 keychain
sudo apt-get install keychain
# 在 ~/.bashrc 中添加
# eval: 用于执行一个字符串作为 shell 命令。
# keychain --eval --agents ssh github_: 这个命令会告诉 keychain 使用指定的 SSH 密钥进行身份验证。
eval `keychain --eval --agents ssh github_`
3. 高阶
要添加多个 SSH key,你可以在 keychain 命令中列出多个密钥文件,用空格分隔。例如:
在 `~/.bashrc` 中修改为:
```bash
eval `keychain --eval --agents ssh github_ id_rsa gitlab_key another_key`
```
示例说明:
- `github_`: GitHub 的密钥
- `id_rsa`: 默认的 SSH 密钥
- `gitlab_key`: GitLab 的密钥
- `another_key`: 其他服务的密钥
注意:
1. 所有的密钥文件都应该在 `~/.ssh/` 目录下
2. 使用的是完整的密钥文件名(不包含 .pub 扩展名)
3. 修改后需要运行 `source ~/.bashrc` 或重新打开终端使更改生效
所以如果你有多个密钥:
```bash
~/.ssh/github_
~/.ssh/gitlab_key
~/.ssh/company_key
```
你可以这样配置:
```bash
eval `keychain --eval --agents ssh github_ gitlab_key company_key`
```
更多 keychain 选项:
- `--quiet`: 减少输出信息
- `--noask`: 不询问密码
- `--timeout 360`: 设置超时时间(分钟)
例如:
```bash
eval `keychain --quiet --eval --agents ssh --timeout 360 github_ gitlab_key`
```
刷新一下 .bashrc 或 .zshrc 文件
```bash
source ~/.bashrc
```
待上文配置完成后第一次运行时需要先运行下面的命令:
ssh -T git@github.com
2) ssh -T git@github.com 仍登录失败
如果 ssh -T git@github.com 仍然无法连接github(我的 win11 使用NAT网络格式的wsl2子系统无法连接,而镜像代理模式是可以连接的),判断可能是网络代理的问题,可以使用网络代理本地的22端口连接远处的github.com 22端口
1. 首先使用 ssh -o "ProxyCommand=nc -x 172.18.144.1:7890 %h 22" git@github.com 连接 github.com 22 端口,我可以连接成功,证明确实是网络代理相关问题。其中 172.18.144.1:7890 是 wsl2 同一网段下win11 的代理地址,实际需要替换为自己的网络代理。

2. 而当使用 ssh -T git@github.com 访问github时,仍然无法访问,此时需要在 ~/.ssh 目录下创建一个 config 文件,用于设置 ssh 在连接 github 时使用网络代理,内容如下
Host github.com # 自定义设置
HostName github.com # ssh 的目标服务器
User git
Port 22 # 端口,也可以使用 443
IdentityFile ~/.ssh/github_11 # github GPG 公钥
ProxyCommand nc -v -x local.windows11.proxy:7890 %h %p # 网络代理,需要将 local.windows11.proxy:7890 改为自己的网络代理
IdentitiesOnly yes
AddKeysToAgent yes
3. 保存后会立即生效,直接使用 ssh -T git@github.com 登录,最后登录成功如下,大功告成

三、vscode 远程链接 ssh config 配置
Host 主机1 # 可定义名称
HostName 远程ip地址或域名
Port 22435 # 远程端口
User root # 远程登录名
IdentityFile /Users/XXXXX/.ssh/id_rsa_XXXXX # 私钥地址(可选)
Host 主机2 # 可定义名称
HostName 远程ip地址
Port 19351 # 远程端口
User root # 远程登录名
LocalForward 8080 localhost:8080 # 映射端口(可选)
IdentityFile /Users/XXXXX/.ssh/id_rsa_XXXXX # 私钥地址(可选)
Host 主机3
HostName 远程ip地址或域名
User root
ForwardAgent yes # 不使用私钥,每次需输入密码
四、git lfs 上传大文件
## 一、什么是 Git LFS?
**Git LFS** 是一个 Git 扩展,用于更有效地管理和存储大文件。它通过将大文件存储在专用的服务器上,而在 Git 仓库中只保存指向这些文件的引用,从而避免仓库体积过大。
## 二、Git LFS 的优点
1. **减小仓库体积**:大文件不直接存储在 Git 对象库中,保持仓库的轻量。
2. **提高性能**:克隆和拉取操作更快,因为只下载需要的文件版本。
3. **版本控制**:仍然可以对大文件进行版本控制,追踪更改历史。
## 三、如何安装和配置 Git LFS
以下是使用 Git LFS 管理大文件的步骤:
### 1. 安装 Git LFS
根据你的操作系统选择相应的安装方法:
- **macOS**:
使用 Homebrew 安装:
```bash
brew install git-lfs
```
- **Linux**:
使用包管理器安装,例如在 Debian/Ubuntu 上:
```bash
sudo apt-get install git-lfs
```
### 2. 初始化 Git LFS
在你的仓库中初始化 Git LFS:
```bash
git lfs install
```
### 3. 指定要使用 Git LFS 管理的文件类型
例如,如果你想使用 Git LFS 管理所有的 `.psd` 文件,可以运行:
```bash
git lfs track "*.psd"
```
你可以根据需要添加更多的文件类型。例如:
```bash
git lfs track "*.zip" "*.mp4" "*.bin"
```
这将会在仓库根目录下创建或更新 `.gitattributes` 文件,内容类似于:
自动生成:
```
*.psd filter=lfs diff=lfs merge=lfs -text
```
### 4. 添加和提交文件
将大文件添加到 Git 仓库中:
```bash
git add .gitattributes
git add path/to/your/largefile.psd
git commit -m "Add large file with Git LFS"
```
### 5. 推送到远程仓库
将更改推送到远程仓库:
```bash
git push origin main
```
**注意**:首次推送时,Git LFS 会上传大文件,因此可能需要一些时间,具体取决于文件大小和网络速度。
五、git 上传忽略一些文件的 .gitignore 文件
项目根目录创建 .gitignore 文件, 格式如下
# 忽略 datas/ 目录下的所有文件,但保留 .gitkeep
datas/**
!datas/.gitkeep
# 忽略 logs/ 目录下的所有文件,但保留 .gitkeep
logs/**
!logs/.gitkeep
# Python 编译文件
__pycache__/
*.py[cod]
# 虚拟环境
# venv/
# .env
# 包管理
# build/
# dist/
# *.egg-info/
# 日志文件
# *.log
# IDE 和编辑器配置
# .vscode/
# .idea/
# *.sublime-project
# *.sublime-workspace
# 操作系统生成的文件
.DS_Store
Thumbs.db
# Jupyter Notebook 检查点
# .ipynb_checkpoints/
# 其他临时文件
# *.tmp
# *.swp
# 删除旧代码的 缓存
git rm -r --cached .
# 添加新的文件
git add .
然后重新提交
六、git 设置用户
设置 Git 用户信息可以通过以下命令操作:
1. 设置全局用户名和邮箱(对所有仓库生效):
```bash
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
```
2. 设置单个仓库的用户名和邮箱(只对当前仓库生效):
```bash
git config user.name "你的用户名"
git config user.email "你的邮箱"
```
3. 查看配置:
```bash
# 查看所有配置
git config --list
# 查看用户名配置
git config user.name
# 查看邮箱配置
git config user.email
```
4. 修改配置:
```bash
# 修改全局用户名
git config --global user.name "新用户名"
# 修改全局邮箱
git config --global user.email "新邮箱"
```
5. 删除配置:
```bash
# 删除全局用户名配置
git config --global --unset user.name
# 删除全局邮箱配置
git config --global --unset user.email
```
6. 配置文件位置:
- 全局配置文件通常在:`~/.gitconfig`
- 单个仓库配置文件在:`.git/config`
注意事项:
1. 用户名和邮箱最好使用实际的或者与你的 Git 托管服务(如 GitHub)一致的信息
2. 全局配置对所有仓库生效,但可以被单个仓库的配置覆盖
3. 设置时注意要在引号内输入完整的用户名或邮箱
示例:
```bash
# 设置全局配置
git config --global user.name "John Doe"
git config --global user.email "johndoe@example.com"
# 验证设置
git config --list
```
七、git 提交合并
两种方式
1. 使用类似vscode IDE的git插件提交后,登录github后项目main支路会提示合并,按照步骤合并皆可
2. 使用类似vscode IDE的git插件提交后,使用命令进行合并
登录github后项目没有PR:可能之前的 PR 已合并,后续提交没重新发 PR,GitHub 的 PR 是针对某个分支快照的,如果你已经合并了一个 PR(比如
v1.0.1 -> main),后续继续在v1.0.1提交新的代码,GitHub 不会自动创建新的 PR 提醒,你需要手动重新发起一个新的 Pull Request。
合并步骤如下
# 先切回 main 分支
git checkout main
# 拉取最新远程同步(避免冲突)
git pull origin main
# 合并代码版本,例如v1.0.1分支的改动
git merge v1.0.1
# 推送更新后的 main
git push origin main
更多推荐

所有评论(0)