# Gitea SSH 上传下载命令总结

## 目录
1. [SSH 密钥配置](#ssh-密钥配置)
2. [仓库克隆与下载](#仓库克隆与下载)
3. [代码上传与推送](#代码上传与推送)
4. [分支操作](#分支操作)
5. [标签操作](#标签操作)
6. [常见问题排查](#常见问题排查)

---

## SSH 密钥配置

### 1. 生成 SSH 密钥
```bash
# 生成新的 SSH 密钥（默认使用 RSA）
ssh-keygen -t rsa -b 4096 -C "mail@smyhub.com"

# 或者使用 Ed25519（更安全）
ssh-keygen -t ed25519 -C "mail@smyhub.com"
```

### 2. 复制公钥到剪贴板
```bash
# macOS
cat ~/.ssh/id_rsa.pub | pbcopy

# Linux（需要安装 xclip）
cat ~/.ssh/id_rsa.pub | xclip -sel clip

# Windows（Git Bash）
cat ~/.ssh/id_rsa.pub | clip
```

### 3. 测试 SSH 连接
```bash
ssh -T git@gitea.example.com
```

---

## 仓库克隆与下载

### 1. 克隆仓库（SSH方式）
```bash
# 标准克隆
git clone git@gitea.example.com:username/repository.git

# 克隆到指定目录
git clone git@gitea.example.com:username/repository.git my-project

# 克隆特定分支
git clone -b branch-name git@gitea.example.com:username/repository.git
```

### 2. 更新已克隆的仓库
```bash
# 拉取最新更改
git pull origin main

# 或指定远程和分支
git pull origin branch-name
```

### 3. 下载特定文件/目录
```bash
# 使用 sparse checkout（部分检出）
git clone --filter=blob:none --sparse git@gitea.example.com:username/repository.git
cd repository
git sparse-checkout init --cone
git sparse-checkout set path/to/directory
```

---

## 代码上传与推送

### 1. 初始化本地仓库并推送到 Gitea
```bash
# 初始化本地仓库
git init
git add .
git commit -m "Initial commit"

# 添加远程仓库
git remote add origin git@gitea.example.com:username/repository.git

#非22标准端口
git remote set-url gitea ssh://git@repo.shumengya.top:8022/shumengya/mengyalinkfly.git

# 首次推送
git push -u origin main  # 或 master
```

### 2. 日常推送更改
```bash
# 添加所有更改
git add .
# 或添加特定文件
git add file1.txt file2.txt

# 提交更改
git commit -m "描述你的更改"

# 推送到远程仓库
git push origin branch-name
```

### 3. 强制推送（谨慎使用）
```bash
# 强制推送覆盖远程分支
git push --force origin branch-name

# 更安全的强制推送（推荐）
git push --force-with-lease origin branch-name
```

---

## 分支操作

### 1. 分支管理
```bash
# 查看所有分支
git branch -a

# 创建新分支
git branch new-branch-name

# 切换到分支
git checkout branch-name
# 或使用更短的方式
git switch branch-name

# 创建并切换到新分支
git checkout -b new-branch-name

# 推送本地分支到远程
git push -u origin branch-name
```

### 2. 删除分支
```bash
# 删除本地分支
git branch -d branch-name

# 强制删除本地分支
git branch -D branch-name

# 删除远程分支
git push origin --delete branch-name
```

### 3. 同步远程分支
```bash
# 获取所有远程分支信息
git fetch --all

# 创建并切换到远程分支的本地副本
git checkout -b local-branch-name origin/remote-branch-name
```

---

## 标签操作

### 1. 标签管理
```bash
# 创建轻量标签
git tag v1.0.0

# 创建带注释的标签
git tag -a v1.0.0 -m "版本 1.0.0"

# 查看所有标签
git tag

# 推送单个标签到远程
git push origin v1.0.0

# 推送所有标签到远程
git push origin --tags
```

### 2. 删除标签
```bash
# 删除本地标签
git tag -d v1.0.0

# 删除远程标签
git push origin --delete v1.0.0
```

---

## 常见问题排查

### 1. SSH 连接问题
```bash
# 测试 SSH 连接
ssh -vT git@gitea.example.com

# 检查 SSH 密钥权限
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

# 查看 SSH 配置
cat ~/.ssh/config
```

### 2. 权限被拒绝错误
如果遇到权限问题，检查：
1. SSH 公钥是否正确添加到 Gitea
2. 仓库访问权限设置
3. SSH 配置文件是否正确

### 3. 典型 SSH 配置示例
```bash
# ~/.ssh/config 文件内容示例
Host gitea.example.com
    HostName gitea.example.com
    User git
    IdentityFile ~/.ssh/id_rsa
    PreferredAuthentications publickey
```

### 4. 修改远程仓库地址
```bash
# 查看当前远程地址
git remote -v

# 修改远程地址
git remote set-url origin git@gitea.example.com:username/repository.git

#非22标准端口
git remote set-url gitea ssh://git@git.shumengya.top:8022/shumengya/mengyalinkfly.git

# 添加多个远程地址
git remote add upstream git@gitea.example.com:otheruser/repository.git

#非22标准端口
git remote set-url gitea ssh://git@git.shumengya.top:8022/shumengya/仓库名.git
```

---

## 快速参考命令卡

| 操作 | 命令 |
|------|------|
| 克隆仓库 | `git clone git@gitea.example.com:user/repo.git` |
| 拉取更新 | `git pull origin branch` |
| 推送更改 | `git push origin branch` |
| 查看状态 | `git status` |
| 查看日志 | `git log --oneline` |
| 添加远程 | `git remote add origin ssh-url` |
| 分支列表 | `git branch -a` |

---
