delete test log
This commit is contained in:
parent
91547de16b
commit
5adbe4b111
|
|
@ -1,482 +0,0 @@
|
|||
# GitLink-GitHub 代码双向同步方案
|
||||
|
||||
**版本**: v1.0
|
||||
**日期**: 2026-04-02
|
||||
**状态**: 已确认
|
||||
|
||||
---
|
||||
|
||||
## 1 概述
|
||||
|
||||
实现 GitHub(主仓)和 GitLink(镜像仓)的代码双向同步,确保两个平台的代码始终一致。通过 Git hooks 在关键操作点进行同步检查,自动解决冲突或提示用户手动处理。
|
||||
|
||||
### 1.1 核心原则
|
||||
|
||||
- **GitHub 为主仓**:GitHub 是代码的唯一真实来源
|
||||
- **GitLink 为镜像仓**:GitLink 作为备份和协作平台
|
||||
- **Hook 控制在 GitLink**:所有同步逻辑通过 GitLink 本地 hooks 实现
|
||||
- **GitHub 完全被动**:GitHub 不需要任何 hook 操作
|
||||
- **冲突自动解决**:优先自动 rebase 解决,无法解决时提示用户
|
||||
|
||||
---
|
||||
|
||||
## 2 同步触发点
|
||||
|
||||
### 2.1 四个关键触发点
|
||||
|
||||
| 触发点 | Hook | 检查内容 | 动作 |
|
||||
|--------|------|---------|------|
|
||||
| **直接 commit** | `pre-commit` | GitLink HEAD vs GitHub HEAD | 不同步则阻止 commit |
|
||||
| **直接 push** | `pre-push` | GitLink HEAD vs GitHub HEAD | 不同步则阻止 push |
|
||||
| **创建 PR** | Webhook | 拉取最新 GitHub 代码 | 自动 rebase 到最新 GitHub 代码 |
|
||||
| **Merge PR** | Webhook | 拉取最新 GitHub 代码 + 自动 rebase | 解决冲突后 merge,并推送到 GitHub |
|
||||
|
||||
### 2.2 触发点详解
|
||||
|
||||
#### 2.2.1 Pre-commit Hook(直接 commit)
|
||||
|
||||
**场景**:用户在 GitLink 本地修改代码后执行 `git commit`
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. 用户执行: git commit -m "..."
|
||||
2. pre-commit hook 触发
|
||||
3. 检查: GitLink HEAD == GitHub HEAD?
|
||||
- 是 → 允许 commit
|
||||
- 否 → 阻止 commit,提示用户执行 rebase
|
||||
```
|
||||
|
||||
**实现**:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# .git/hooks/pre-commit
|
||||
|
||||
GITHUB_HEAD=$(git ls-remote https://github.com/owner/repo HEAD | awk '{print $1}')
|
||||
GITLINK_HEAD=$(git rev-parse HEAD)
|
||||
|
||||
if [ "$GITHUB_HEAD" != "$GITLINK_HEAD" ]; then
|
||||
echo "❌ Error: GitLink HEAD 不同步 GitHub"
|
||||
echo "请执行: git fetch github && git rebase github/main"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
```
|
||||
|
||||
#### 2.2.2 Pre-push Hook(直接 push)
|
||||
|
||||
**场景**:用户在 GitLink 本地修改代码后执行 `git push`
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. 用户执行: git push origin main
|
||||
2. pre-push hook 触发
|
||||
3. 检查: GitLink HEAD == GitHub HEAD?
|
||||
- 是 → 允许 push
|
||||
- 否 → 阻止 push,提示用户执行 rebase
|
||||
```
|
||||
|
||||
**实现**:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# .git/hooks/pre-push
|
||||
|
||||
GITHUB_HEAD=$(git ls-remote https://github.com/owner/repo HEAD | awk '{print $1}')
|
||||
GITLINK_HEAD=$(git rev-parse HEAD)
|
||||
|
||||
if [ "$GITHUB_HEAD" != "$GITLINK_HEAD" ]; then
|
||||
echo "❌ Error: GitLink HEAD 不同步 GitHub"
|
||||
echo "请执行: git fetch github && git rebase github/main"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
```
|
||||
|
||||
#### 2.2.3 创建 PR 时同步(Webhook)
|
||||
|
||||
**场景**:用户在 GitLink 创建 PR
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. 用户在 GitLink 创建 PR: feature → main
|
||||
2. GitLink webhook 触发
|
||||
3. 拉取最新 GitHub 代码到 GitLink
|
||||
4. 自动 rebase PR 分支到最新 GitHub main
|
||||
5. 如果冲突可自动解决 → 直接解决
|
||||
6. 如果冲突无法自动解决 → 提示用户手动解决
|
||||
```
|
||||
|
||||
**实现逻辑**:
|
||||
```
|
||||
POST /webhook/pr-created
|
||||
├─ 获取 PR 信息 (source_branch, target_branch)
|
||||
├─ git fetch github main
|
||||
├─ git checkout source_branch
|
||||
├─ git rebase github/main
|
||||
│ ├─ 冲突可解决 → 自动解决 + git rebase --continue
|
||||
│ └─ 冲突无法解决 → 提示用户,PR 标记为 "需要手动 rebase"
|
||||
└─ 更新 PR 状态
|
||||
```
|
||||
|
||||
#### 2.2.4 Merge PR 时同步(Webhook)
|
||||
|
||||
**场景**:用户在 GitLink 合并 PR
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. 用户在 GitLink 点击 "Merge PR"
|
||||
2. GitLink webhook 触发
|
||||
3. 拉取最新 GitHub 代码到 GitLink
|
||||
4. 自动 rebase PR 分支到最新 GitHub main
|
||||
5. 如果冲突可自动解决 → 直接解决 + merge
|
||||
6. 如果冲突无法自动解决 → 停止 merge,提示用户
|
||||
7. Merge 成功后,自动 push 到 GitHub
|
||||
```
|
||||
|
||||
**实现逻辑**:
|
||||
```
|
||||
POST /webhook/pr-merge
|
||||
├─ 获取 PR 信息 (source_branch, target_branch)
|
||||
├─ git fetch github main
|
||||
├─ git checkout source_branch
|
||||
├─ git rebase github/main
|
||||
│ ├─ 冲突可解决 → 自动解决 + git rebase --continue
|
||||
│ └─ 冲突无法解决 → 停止 merge,返回错误
|
||||
├─ git checkout target_branch
|
||||
├─ git merge source_branch
|
||||
├─ git push github target_branch
|
||||
└─ 更新 PR 状态为 "已合并"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3 冲突处理策略
|
||||
|
||||
### 3.1 冲突类型与解决方案
|
||||
|
||||
| 冲突类型 | 原因 | 解决方案 |
|
||||
|---------|------|--------|
|
||||
| **文件内容冲突** | 同一文件同一行被修改 | 自动 rebase(Git 尝试自动合并) |
|
||||
| **文件删除冲突** | 一边删除,一边修改 | 提示用户手动选择 |
|
||||
| **文件重命名冲突** | 同一文件被重命名为不同名称 | 提示用户手动选择 |
|
||||
| **二进制文件冲突** | 二进制文件被修改 | 提示用户手动选择 |
|
||||
|
||||
### 3.2 自动解决策略
|
||||
|
||||
**可自动解决的冲突**:
|
||||
- 不同文件的修改
|
||||
- 同一文件不同行的修改
|
||||
- 简单的文本冲突(Git 能自动合并)
|
||||
|
||||
**实现**:
|
||||
```bash
|
||||
git rebase github/main --no-edit
|
||||
|
||||
# 如果有冲突,尝试自动解决
|
||||
if [ $? -ne 0 ]; then
|
||||
# 尝试使用 ours 或 theirs 策略
|
||||
git rebase --continue --strategy=recursive -X ours
|
||||
fi
|
||||
```
|
||||
|
||||
### 3.3 无法自动解决时的处理
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. Rebase 失败,存在冲突
|
||||
2. 返回错误信息给用户
|
||||
3. PR 标记为 "冲突" 状态
|
||||
4. 用户本地手动解决冲突
|
||||
5. 用户执行: git rebase --continue
|
||||
6. 用户 push 到 GitLink
|
||||
7. Pre-push hook 检查 → 通过
|
||||
8. 用户重新点击 "Merge PR"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4 实现架构
|
||||
|
||||
### 4.1 组件清单
|
||||
|
||||
| 组件 | 位置 | 职责 |
|
||||
|------|------|------|
|
||||
| **Pre-commit Hook** | `.git/hooks/pre-commit` | 检查 commit 前的同步状态 |
|
||||
| **Pre-push Hook** | `.git/hooks/pre-push` | 检查 push 前的同步状态 |
|
||||
| **PR Created Webhook** | GitLink 服务端 | 创建 PR 时自动 rebase |
|
||||
| **PR Merged Webhook** | GitLink 服务端 | Merge PR 时自动 rebase + push GitHub |
|
||||
| **Sync CLI Command** | `gitlink-cli sync` | 手动触发同步(可选) |
|
||||
|
||||
### 4.2 数据流
|
||||
|
||||
```
|
||||
GitHub (主仓)
|
||||
↓ (git fetch)
|
||||
GitLink 本地仓库
|
||||
├─ pre-commit hook (检查同步)
|
||||
├─ pre-push hook (检查同步)
|
||||
└─ webhook (创建/合并 PR 时自动 rebase)
|
||||
↓ (git push)
|
||||
GitLink 远程仓库
|
||||
↓ (webhook)
|
||||
GitHub (推送更新)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5 用户工作流
|
||||
|
||||
### 5.1 场景 1:直接 commit 到 GitLink
|
||||
|
||||
```bash
|
||||
# 1. 用户在 GitLink 本地修改代码
|
||||
cd gitlink-cli
|
||||
echo "new code" >> file.txt
|
||||
|
||||
# 2. 执行 commit
|
||||
git commit -m "feat: add new feature"
|
||||
|
||||
# 3. Pre-commit hook 检查
|
||||
# ✅ 如果 HEAD 同步 → commit 成功
|
||||
# ❌ 如果 HEAD 不同步 → commit 失败,提示 rebase
|
||||
|
||||
# 4. 如果失败,用户手动 rebase
|
||||
git fetch github
|
||||
git rebase github/main
|
||||
|
||||
# 5. 重新 commit
|
||||
git commit -m "feat: add new feature"
|
||||
```
|
||||
|
||||
### 5.2 场景 2:创建 PR
|
||||
|
||||
```bash
|
||||
# 1. 用户创建 feature 分支
|
||||
git checkout -b feature/new-feature
|
||||
|
||||
# 2. 修改代码并 commit
|
||||
git commit -m "feat: implement feature"
|
||||
|
||||
# 3. Push 到 GitLink
|
||||
git push origin feature/new-feature
|
||||
|
||||
# 4. 在 GitLink 创建 PR: feature/new-feature → main
|
||||
# GitLink webhook 自动触发:
|
||||
# - 拉取最新 GitHub 代码
|
||||
# - 自动 rebase feature 分支到最新 GitHub main
|
||||
# - 如果冲突可解决 → 自动解决
|
||||
# - 如果冲突无法解决 → PR 标记为 "需要手动 rebase"
|
||||
```
|
||||
|
||||
### 5.3 场景 3:Merge PR
|
||||
|
||||
```bash
|
||||
# 1. 用户在 GitLink 点击 "Merge PR"
|
||||
# GitLink webhook 自动触发:
|
||||
# - 拉取最新 GitHub 代码
|
||||
# - 自动 rebase PR 分支到最新 GitHub main
|
||||
# - 如果冲突可解决 → 自动解决 + merge
|
||||
# - 如果冲突无法解决 → merge 失败,提示用户
|
||||
|
||||
# 2. Merge 成功后,自动 push 到 GitHub
|
||||
# GitHub 代码自动更新
|
||||
```
|
||||
|
||||
### 5.4 场景 4:直接 push 到 GitLink
|
||||
|
||||
```bash
|
||||
# 1. 用户本地修改代码并 commit
|
||||
git commit -m "fix: bug fix"
|
||||
|
||||
# 2. 执行 push
|
||||
git push origin main
|
||||
|
||||
# 3. Pre-push hook 检查
|
||||
# ✅ 如果 HEAD 同步 → push 成功
|
||||
# ❌ 如果 HEAD 不同步 → push 失败,提示 rebase
|
||||
|
||||
# 4. 如果失败,用户手动 rebase
|
||||
git fetch github
|
||||
git rebase github/main
|
||||
git push origin main
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6 配置与部署
|
||||
|
||||
### 6.1 Hook 安装
|
||||
|
||||
在 gitlink-cli 项目中创建 hooks:
|
||||
|
||||
```bash
|
||||
# 创建 hooks 目录
|
||||
mkdir -p .githooks
|
||||
|
||||
# 创建 pre-commit hook
|
||||
cat > .githooks/pre-commit << 'EOF'
|
||||
#!/bin/bash
|
||||
GITHUB_HEAD=$(git ls-remote https://github.com/owner/repo HEAD | awk '{print $1}')
|
||||
GITLINK_HEAD=$(git rev-parse HEAD)
|
||||
if [ "$GITHUB_HEAD" != "$GITLINK_HEAD" ]; then
|
||||
echo "❌ Error: GitLink HEAD 不同步 GitHub"
|
||||
echo "请执行: git fetch github && git rebase github/main"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
# 创建 pre-push hook
|
||||
cat > .githooks/pre-push << 'EOF'
|
||||
#!/bin/bash
|
||||
GITHUB_HEAD=$(git ls-remote https://github.com/owner/repo HEAD | awk '{print $1}')
|
||||
GITLINK_HEAD=$(git rev-parse HEAD)
|
||||
if [ "$GITHUB_HEAD" != "$GITLINK_HEAD" ]; then
|
||||
echo "❌ Error: GitLink HEAD 不同步 GitHub"
|
||||
echo "请执行: git fetch github && git rebase github/main"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
# 设置权限
|
||||
chmod +x .githooks/pre-commit .githooks/pre-push
|
||||
|
||||
# 配置 Git 使用这些 hooks
|
||||
git config core.hooksPath .githooks
|
||||
```
|
||||
|
||||
### 6.2 Webhook 配置
|
||||
|
||||
在 GitLink 项目设置中配置 webhooks:
|
||||
|
||||
**PR Created Webhook**:
|
||||
- URL: `https://your-server/webhook/pr-created`
|
||||
- 事件: Pull Request Created
|
||||
- 负载: PR 信息(source_branch, target_branch, pr_id)
|
||||
|
||||
**PR Merged Webhook**:
|
||||
- URL: `https://your-server/webhook/pr-merged`
|
||||
- 事件: Pull Request Merged
|
||||
- 负载: PR 信息(source_branch, target_branch, pr_id)
|
||||
|
||||
---
|
||||
|
||||
## 7 风险与缓解
|
||||
|
||||
### 7.1 潜在风险
|
||||
|
||||
| 风险 | 影响 | 缓解措施 |
|
||||
|------|------|--------|
|
||||
| **Rebase 失败** | PR 无法合并 | 提示用户手动解决,PR 标记为冲突 |
|
||||
| **GitHub 网络不可达** | Hook 超时 | 设置超时时间,失败时提示用户 |
|
||||
| **Webhook 失败** | 同步不及时 | 重试机制 + 手动同步命令 |
|
||||
| **并发 merge** | 数据不一致 | 使用分布式锁或队列 |
|
||||
|
||||
### 7.2 缓解方案
|
||||
|
||||
**Hook 超时处理**:
|
||||
```bash
|
||||
timeout 5 git ls-remote https://github.com/owner/repo HEAD
|
||||
if [ $? -eq 124 ]; then
|
||||
echo "⚠️ Warning: GitHub 网络超时,跳过同步检查"
|
||||
exit 0 # 允许操作继续
|
||||
fi
|
||||
```
|
||||
|
||||
**Webhook 重试**:
|
||||
```
|
||||
失败 → 等待 5 秒 → 重试
|
||||
失败 → 等待 10 秒 → 重试
|
||||
失败 → 等待 30 秒 → 重试
|
||||
失败 → 记录日志,通知管理员
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8 手动同步命令(可选)
|
||||
|
||||
提供 CLI 命令供用户手动触发同步:
|
||||
|
||||
```bash
|
||||
# 手动同步 GitLink 到最新 GitHub 代码
|
||||
gitlink-cli sync --from github --to gitlink
|
||||
|
||||
# 手动同步 GitHub 到最新 GitLink 代码(不推荐)
|
||||
gitlink-cli sync --from gitlink --to github
|
||||
|
||||
# 查看同步状态
|
||||
gitlink-cli sync status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9 验证与测试
|
||||
|
||||
### 9.1 测试场景
|
||||
|
||||
| 场景 | 预期结果 | 验证方法 |
|
||||
|------|---------|--------|
|
||||
| GitHub 有新代码,GitLink 直接 commit | Commit 失败,提示 rebase | 执行 commit,检查错误信息 |
|
||||
| GitHub 有新代码,GitLink 直接 push | Push 失败,提示 rebase | 执行 push,检查错误信息 |
|
||||
| 创建 PR 时 GitHub 有新代码 | 自动 rebase,PR 创建成功 | 创建 PR,检查 PR 状态 |
|
||||
| Merge PR 时 GitHub 有新代码 | 自动 rebase + merge,推送 GitHub | Merge PR,检查 GitHub 代码 |
|
||||
| 冲突无法自动解决 | PR 标记为<E8AEB0><E4B8BA>突,提示用户 | 创建冲突 PR,检查状态 |
|
||||
|
||||
### 9.2 测试命令
|
||||
|
||||
```bash
|
||||
# 1. 测试 pre-commit hook
|
||||
git commit -m "test"
|
||||
|
||||
# 2. 测试 pre-push hook
|
||||
git push origin main
|
||||
|
||||
# 3. 测试 PR 创建同步
|
||||
# 在 GitLink 创建 PR,检查是否自动 rebase
|
||||
|
||||
# 4. 测试 PR 合并同步
|
||||
# 在 GitLink 合并 PR,检查 GitHub 是否更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10 后续优化
|
||||
|
||||
### 10.1 短期(1-2 周)
|
||||
|
||||
- [ ] 实现 pre-commit 和 pre-push hooks
|
||||
- [ ] 实现 PR Created 和 PR Merged webhooks
|
||||
- [ ] 编写测试用例
|
||||
- [ ] 文档完善
|
||||
|
||||
### 10.2 中期(2-4 周)
|
||||
|
||||
- [ ] 实现手动同步 CLI 命令
|
||||
- [ ] 添加同步状态监控
|
||||
- [ ] 优化冲突自动解决策略
|
||||
- [ ] 添加日志和告警
|
||||
|
||||
### 10.3 长期(1 个月+)
|
||||
|
||||
- [ ] Issue 和 PR 元数据同步
|
||||
- [ ] 评论和 Review 同步
|
||||
- [ ] 自动化测试和 CI/CD 集成
|
||||
- [ ] 性能优化和扩展性改进
|
||||
|
||||
---
|
||||
|
||||
## 11 总结
|
||||
|
||||
本方案通过 **Git hooks + Webhooks** 的组合,实现了 GitHub 和 GitLink 的代码双向同步。核心特点:
|
||||
|
||||
✅ **GitHub 为主仓**:确保代码唯一真实来源
|
||||
✅ **自动冲突解决**:优先自动 rebase,无法解决时提示用户
|
||||
✅ **多触发点**:commit、push、PR 创建、PR 合并都有同步检查
|
||||
✅ **用户友好**:清晰的错误提示和恢复指导
|
||||
✅ **低风险**:失败时提示用户,不会自动破坏代码
|
||||
|
||||
---
|
||||
|
||||
**审批人**: [待确认]
|
||||
**实施日期**: [待定]
|
||||
**联系人**: [待定]
|
||||
|
|
@ -1,373 +0,0 @@
|
|||
# GitLink-GitHub 代码双向同步方案(最终版)
|
||||
|
||||
**版本**: v2.0(最终确认)
|
||||
**日期**: 2026-04-02
|
||||
**状态**: 已确认,可实施
|
||||
|
||||
---
|
||||
|
||||
## 1 核心原则
|
||||
|
||||
- **GitHub 为主仓**:GitHub 是代码的唯一真实来源
|
||||
- **GitLink 为镜像仓**:GitLink 作为备份和协作平台
|
||||
- **所有操作在 GitLink 服务端**:无需用户本地配置
|
||||
- **Main 分支保护**:只能通过 PR merge,禁止直接 push
|
||||
- **关键点同步**:PR create/patch/merge 时自动同步 GitHub
|
||||
|
||||
---
|
||||
|
||||
## 2 同步触发点
|
||||
|
||||
### 2.1 三个关键触发点
|
||||
|
||||
| 触发点 | 事件 | 操作 |
|
||||
|--------|------|------|
|
||||
| **PR Create** | 用户创建 PR | fetch GitHub + rebase |
|
||||
| **PR Patch** | 用户修改 PR(push 新 commit) | fetch GitHub + rebase |
|
||||
| **PR Merge** | 用户点击 merge | fetch GitHub + rebase + merge + push GitHub |
|
||||
|
||||
### 2.2 详细流程
|
||||
|
||||
#### 2.2.1 PR Create 时同步
|
||||
|
||||
**触发**:用户在 GitLink 创建 PR(feature → main)
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. GitLink webhook 接收 PR created 事件
|
||||
2. 执行:
|
||||
├─ git fetch github main
|
||||
├─ git checkout feature_branch
|
||||
├─ git rebase github/main
|
||||
├─ 检查是否有冲突
|
||||
│ ├─ 有冲突 → PR 标记为 "需要 rebase"
|
||||
│ │ 返回错误信息给用户
|
||||
│ └─ 无冲突 → PR 状态正常,可以 merge
|
||||
└─ 完成
|
||||
```
|
||||
|
||||
**用户体验**:
|
||||
- 如果无冲突:PR 创建成功,可以 merge
|
||||
- 如果有冲突:PR 创建成功,但标记为冲突,提示用户本地解决冲突后重新 push
|
||||
|
||||
#### 2.2.2 PR Patch 时同步
|
||||
|
||||
**触发**:用户修改 PR(在 feature 分支上新增 commit 并 push)
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. GitLink webhook 接收 PR updated 事件
|
||||
2. 执行:
|
||||
├─ git fetch github main
|
||||
├─ git checkout feature_branch
|
||||
├─ git rebase github/main
|
||||
├─ 检查是否有冲突
|
||||
│ ├─ 有冲突 → PR 标记为 "需要 rebase"
|
||||
│ │ 返回错误信息给用户
|
||||
│ └─ 无冲突 → PR 状态正常,可以 merge
|
||||
└─ 完成
|
||||
```
|
||||
|
||||
**用户体验**:
|
||||
- 每次 push 新 commit 时,自动检查是否与 GitHub 最新代码冲突
|
||||
- 如果有冲突,立即提示用户
|
||||
|
||||
#### 2.2.3 PR Merge 时同步
|
||||
|
||||
**触发**:用户在 GitLink 点击 "Merge PR"
|
||||
|
||||
**流程**:
|
||||
```
|
||||
1. GitLink webhook 接收 PR merged 事件
|
||||
2. 执行(事务性操作):
|
||||
├─ git fetch github main
|
||||
├─ git checkout feature_branch
|
||||
├─ git rebase github/main
|
||||
├─ 检查是否有冲突
|
||||
│ ├─ 有冲突 → merge 失败
|
||||
│ │ 返回错误信息给用户
|
||||
│ │ PR 状态回滚到 "open"
|
||||
│ └─ 无冲突 → 继续
|
||||
├─ git checkout main
|
||||
├─ git merge feature_branch
|
||||
├─ git push github main
|
||||
├─ 检查 push 是否成功
|
||||
│ ├─ 失败 → merge 失败,回滚
|
||||
│ └─ 成功 → merge 成功,PR 标记为 "merged"
|
||||
└─ 完成
|
||||
```
|
||||
|
||||
**用户体验**:
|
||||
- 点击 merge 后,自动完成所有同步操作
|
||||
- 如果有冲突或 push 失败,立即反馈给用户
|
||||
- 成功后,GitHub 和 GitLink 代码自动同步
|
||||
|
||||
---
|
||||
|
||||
## 3 Main 分支保护
|
||||
|
||||
### 3.1 保护规则
|
||||
|
||||
| 规则 | 说明 |
|
||||
|------|------|
|
||||
| 禁止直接 push | 用户不能直接 push 到 main 分支 |
|
||||
| 只能 PR merge | main 分支只能通过 PR merge 更新 |
|
||||
| 禁止 force push | GitLink 禁止所有 force push 操作 |
|
||||
|
||||
### 3.2 实现
|
||||
|
||||
在 GitLink 服务端配置分支保护:
|
||||
|
||||
```
|
||||
项目设置 → 分支保护
|
||||
├─ 分支名称: main
|
||||
├─ 禁止直接 push: ✅
|
||||
├─ 禁止 force push: ✅
|
||||
└─ 只能通过 PR merge: ✅
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4 用户工作流
|
||||
|
||||
### 4.1 场景 1:创建 PR
|
||||
|
||||
```bash
|
||||
# 1. 用户在本地创建 feature 分支
|
||||
git checkout -b feature/new-feature
|
||||
|
||||
# 2. 修改代码并 commit
|
||||
git commit -m "feat: implement feature"
|
||||
|
||||
# 3. Push 到 GitLink
|
||||
git push origin feature/new-feature
|
||||
|
||||
# 4. 在 GitLink 创建 PR: feature/new-feature → main
|
||||
# GitLink webhook 自动触发:
|
||||
# - fetch github main
|
||||
# - rebase feature 到 github/main
|
||||
# - 如果无冲突 → PR 创建成功
|
||||
# - 如果有冲突 → PR 标记为 "需要 rebase",提示用户
|
||||
```
|
||||
|
||||
### 4.2 场景 2:修改 PR(Patch)
|
||||
|
||||
```bash
|
||||
# 1. 用户在 feature 分支继续修改
|
||||
git add .
|
||||
git commit -m "fix: address review comments"
|
||||
|
||||
# 2. Push 到 GitLink
|
||||
git push origin feature/new-feature
|
||||
|
||||
# 3. GitLink webhook 自动触发:
|
||||
# - fetch github main
|
||||
# - rebase feature 到 github/main
|
||||
# - 如果无冲突 → PR 更新成功
|
||||
# - 如果有冲突 → PR 标记为 "需要 rebase",提示用户
|
||||
```
|
||||
|
||||
### 4.3 场景 3:Merge PR
|
||||
|
||||
```bash
|
||||
# 1. 用户在 GitLink 点击 "Merge PR"
|
||||
# GitLink webhook 自动触发:
|
||||
# - fetch github main
|
||||
# - rebase feature 到 github/main
|
||||
# - merge feature 到 main
|
||||
# - push 到 github main
|
||||
# - 如果无冲突 → merge 成功,GitHub 自动更新
|
||||
# - 如果有冲突 → merge 失败,提示用户
|
||||
```
|
||||
|
||||
### 4.4 场景 4:直接 Push(不允许)
|
||||
|
||||
```bash
|
||||
# 用户尝试直接 push 到 main
|
||||
git push origin main
|
||||
|
||||
# GitLink 拒绝:
|
||||
# ❌ Error: 禁止直接 push 到 main 分支
|
||||
# 请通过 PR merge 提交代码
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5 冲突处理
|
||||
|
||||
### 5.1 冲突检测
|
||||
|
||||
在 PR create/patch/merge 时,GitLink 自动检查是否有冲突:
|
||||
|
||||
```bash
|
||||
git rebase github/main
|
||||
|
||||
# 如果有冲突,rebase 会失败
|
||||
if [ $? -ne 0 ]; then
|
||||
# 有冲突
|
||||
return error "冲突检测"
|
||||
fi
|
||||
```
|
||||
|
||||
### 5.2 冲突提示
|
||||
|
||||
当检测到冲突时,返回给用户:
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": false,
|
||||
"error": {
|
||||
"code": "CONFLICT",
|
||||
"message": "PR 与 GitHub 最新代码有冲突",
|
||||
"details": {
|
||||
"conflicted_files": ["file1.js", "file2.js"],
|
||||
"suggestion": "请在本地解决冲突后重新 push"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 用户解决冲突
|
||||
|
||||
```bash
|
||||
# 1. 用户本地拉取最新代码
|
||||
git fetch origin
|
||||
git fetch github
|
||||
|
||||
# 2. 本地 rebase 到 github/main
|
||||
git rebase github/main
|
||||
|
||||
# 3. 手动解决冲突
|
||||
# 编辑冲突文件,解决冲突
|
||||
|
||||
# 4. 继续 rebase
|
||||
git add .
|
||||
git rebase --continue
|
||||
|
||||
# 5. 强制推送到 GitLink(覆盖之前的 commit)
|
||||
git push origin feature/new-feature --force-with-lease
|
||||
|
||||
# 6. GitLink 再次检查冲突
|
||||
# 如果无冲突 → PR 更新成功
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6 错误处理
|
||||
|
||||
### 6.1 常见错误
|
||||
|
||||
| 错误 | 原因 | 解决方案 |
|
||||
|------|------|--------|
|
||||
| 冲突 | PR 与 GitHub 最新代码冲突 | 本地解决冲突后重新 push |
|
||||
| Push 失败 | GitHub 网络问题 | 重试或联系管理员 |
|
||||
| Merge 失败 | 冲突或权限问题 | 检查冲突或权限 |
|
||||
|
||||
### 6.2 错误恢复
|
||||
|
||||
**如果 PR merge 失败**:
|
||||
|
||||
```
|
||||
1. GitLink 自动回滚 merge 操作
|
||||
2. PR 状态回到 "open"
|
||||
3. 用户收到错误提示
|
||||
4. 用户解决问题后重新 merge
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7 实现清单
|
||||
|
||||
### 7.1 GitLink 服务端
|
||||
|
||||
- [ ] 配置 main 分支保护(禁止直接 push、禁止 force push)
|
||||
- [ ] 实现 PR created webhook
|
||||
- [ ] fetch github main
|
||||
- [ ] rebase feature 到 github/main
|
||||
- [ ] 检查冲突,标记 PR 状态
|
||||
- [ ] 实现 PR updated webhook
|
||||
- [ ] fetch github main
|
||||
- [ ] rebase feature 到 github/main
|
||||
- [ ] 检查冲突,标记 PR 状态
|
||||
- [ ] 实现 PR merged webhook(事务性操作)
|
||||
- [ ] fetch github main
|
||||
- [ ] rebase feature 到 github/main
|
||||
- [ ] merge feature 到 main
|
||||
- [ ] push 到 github main
|
||||
- [ ] 失败时回滚
|
||||
|
||||
### 7.2 错误提示
|
||||
|
||||
- [ ] 冲突时返回详细错误信息
|
||||
- [ ] 包含冲突文件列表
|
||||
- [ ] 包含解决方案建议
|
||||
|
||||
### 7.3 文档
|
||||
|
||||
- [ ] 更新 README,说明 main 分支保护规则
|
||||
- [ ] 编写用户指南,说明 PR 工作流
|
||||
- [ ] 编写故障排查指南
|
||||
|
||||
---
|
||||
|
||||
## 8 验证与测试
|
||||
|
||||
### 8.1 测试场景
|
||||
|
||||
| 场景 | 预期结果 |
|
||||
|------|---------|
|
||||
| 创建无冲突 PR | PR 创建成功 |
|
||||
| 创建有冲突 PR | PR 标记为冲突,提示用户 |
|
||||
| Patch 无冲突 | PR 更新成功 |
|
||||
| Patch 有冲突 | PR 标记为冲突,提示用户 |
|
||||
| Merge 无冲突 | Merge 成功,GitHub 自动更新 |
|
||||
| Merge 有冲突 | Merge 失败,PR 回滚到 open |
|
||||
| 直接 push main | 拒绝,提示只能 PR merge |
|
||||
| Force push | 拒绝,提示禁止 force push |
|
||||
|
||||
### 8.2 测试命令
|
||||
|
||||
```bash
|
||||
# 1. 创建 PR
|
||||
git checkout -b feature/test
|
||||
echo "test" >> file.txt
|
||||
git commit -m "test"
|
||||
git push origin feature/test
|
||||
# 在 GitLink 创建 PR
|
||||
|
||||
# 2. 修改 PR
|
||||
echo "test2" >> file.txt
|
||||
git commit -m "test2"
|
||||
git push origin feature/test
|
||||
|
||||
# 3. Merge PR
|
||||
# 在 GitLink 点击 merge
|
||||
|
||||
# 4. 验证 GitHub 是否更新
|
||||
git log --oneline # 检查 GitHub 是否有新 commit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9 总结
|
||||
|
||||
**方案特点**:
|
||||
|
||||
✅ **简洁**:只在 PR create/patch/merge 时同步
|
||||
✅ **安全**:main 分支保护,禁止直接 push
|
||||
✅ **可靠**:事务性 merge,失败自动回滚
|
||||
✅ **用户友好**:清晰的错误提示和恢复指导
|
||||
✅ **无需本地配置**:所有操作在 GitLink 服务端
|
||||
|
||||
**预期效果**:
|
||||
|
||||
- GitHub 和 GitLink 代码始终一致
|
||||
- 用户只需正常 git 操作
|
||||
- 冲突自动检测,提示用户解决
|
||||
- 代码质量有保证(PR review + merge)
|
||||
|
||||
---
|
||||
|
||||
**审批**:已确认
|
||||
**实施日期**:待定
|
||||
**联系人**:待定
|
||||
|
|
@ -1,595 +0,0 @@
|
|||
# 代码同步方案 - 深度审视与优化
|
||||
|
||||
**审视日期**: 2026-04-02
|
||||
**审视范围**: 用户场景、漏洞、优化点
|
||||
|
||||
---
|
||||
|
||||
## 1 发现的关键漏洞
|
||||
|
||||
### 1.1 漏洞 1:GitHub 直接 push 无法同步到 GitLink
|
||||
|
||||
**问题描述**:
|
||||
- 用户在 GitHub 直接 push 代码(不通过 GitLink)
|
||||
- GitLink 本地仓库不知道 GitHub 有新代码
|
||||
- 下次用户在 GitLink 操作时,HEAD 已经不同步,但用户不知道
|
||||
|
||||
**场景**:
|
||||
```
|
||||
1. 用户在 GitHub Web UI 直接修改文件并 commit
|
||||
2. 或用户在另一台机器 push 到 GitHub
|
||||
3. GitLink 本地仓库 HEAD 仍指向旧代码
|
||||
4. 用户在 GitLink 执行 commit/push 时,pre-commit/pre-push hook 才发现不同步
|
||||
5. 用户被迫 rebase,但此时可能已经做了本地修改
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- 用户体验差:突然被告知需要 rebase
|
||||
- 可能丢失本地修改:如果用户强制操作
|
||||
|
||||
**优化方案**:
|
||||
- 添加 **post-checkout hook**:每次切换分支时检查 GitHub 是否有新代码
|
||||
- 添加 **post-merge hook**:每次 merge 后检查 GitHub 是否有新代码
|
||||
- 提供 **定时同步任务**:每 N 分钟自动检查一次 GitHub 是否有新代码
|
||||
|
||||
---
|
||||
|
||||
### 1.2 漏洞 2:Force Push 绕过 Hook
|
||||
|
||||
**问题描述**:
|
||||
- 用户可以使用 `git push --force` 绕过 pre-push hook
|
||||
- 这会导致 GitLink 和 GitHub 代码不一致
|
||||
|
||||
**场景**:
|
||||
```bash
|
||||
git push origin main --force # 绕过 pre-push hook
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- 破坏同步机制
|
||||
- 可能覆盖他人代码
|
||||
|
||||
**优化方案**:
|
||||
- 在 pre-push hook 中检查 `--force` 标志,直接拒绝
|
||||
- 或在 GitLink 服务端配置分支保护,禁止 force push
|
||||
|
||||
---
|
||||
|
||||
### 1.3 漏洞 3:多分支场景处理不清
|
||||
|
||||
**问题描述**:
|
||||
- 方案只考虑了 `main` 分支的同步
|
||||
- 用户可能在多个分支上工作(develop、feature 等)
|
||||
- 不同分支的同步策略不同
|
||||
|
||||
**场景**:
|
||||
```
|
||||
1. 用户在 feature 分支工作
|
||||
2. GitHub 的 main 分支有新代码
|
||||
3. 用户在 feature 分支 commit,pre-commit hook 检查 main 分支
|
||||
4. 但用户实际在 feature 分支,不需要同步 main
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- Hook 逻辑不清:应该检查当前分支还是 main 分支?
|
||||
- 可能误报或漏报
|
||||
|
||||
**优化方案**:
|
||||
- **明确分支同步策略**:
|
||||
- `main` 分支:必须与 GitHub main 同步
|
||||
- `develop` 分支:必须与 GitHub develop 同步
|
||||
- `feature/*` 分支:只需与本地 main 同步(可选)
|
||||
- Hook 根据当前分支选择对应的检查策略
|
||||
|
||||
---
|
||||
|
||||
### 1.4 漏洞 4:Rebase 冲突后的恢复流程不清
|
||||
|
||||
**问题描述**:
|
||||
- 用户执行 `git rebase github/main` 后,如果有冲突
|
||||
- 用户手动解决冲突后,需要 `git rebase --continue`
|
||||
- 但方案没有明确说明这个流程
|
||||
|
||||
**场景**:
|
||||
```bash
|
||||
git rebase github/main
|
||||
# 冲突!
|
||||
# 用户手动解决冲突
|
||||
git add .
|
||||
git rebase --continue
|
||||
# 现在可以 commit 了
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- 用户可能不知道如何恢复
|
||||
- 可能导致 rebase 中止或错误操作
|
||||
|
||||
**优化方案**:
|
||||
- 在 hook 失败时提供详细的恢复指导
|
||||
- 提供 `gitlink-cli sync --resolve` 命令自动处理恢复流程
|
||||
|
||||
---
|
||||
|
||||
### 1.5 漏洞 5:Webhook 失败时的数据一致性问题
|
||||
|
||||
**问题描述**:
|
||||
- PR 在 GitLink 成功 merge,但 webhook 推送到 GitHub 失败
|
||||
- GitLink 和 GitHub 代码不一致,且无法自动恢复
|
||||
|
||||
**场景**:
|
||||
```
|
||||
1. 用户在 GitLink merge PR
|
||||
2. GitLink 本地 merge 成功
|
||||
3. Webhook 尝试 push 到 GitHub,但网络失败
|
||||
4. GitLink 已 merge,GitHub 未更新
|
||||
5. 下次用户操作时,发现不一致
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- 数据不一致
|
||||
- 需要手动干预恢复
|
||||
|
||||
**优化方案**:
|
||||
- **事务性操作**:merge 和 push 作为一个原子操作
|
||||
- **重试机制**:webhook 失败时自动重试(指数退避)
|
||||
- **死信队列**:重试失败后放入队列,定期重试
|
||||
- **监控告警**:同步失<EFBFBD><EFBFBD><EFBFBD>时立即告警
|
||||
|
||||
---
|
||||
|
||||
### 1.6 漏洞 6:并发操作导致的竞态条件
|
||||
|
||||
**问题描述**:
|
||||
- 多个用户同时在 GitLink 和 GitHub 操作
|
||||
- 可能导致竞态条件和数据不一致
|
||||
|
||||
**场景**:
|
||||
```
|
||||
时间线:
|
||||
T1: 用户 A 在 GitLink merge PR1
|
||||
T2: 用户 B 在 GitHub push 代码
|
||||
T3: 用户 A 的 webhook 尝试 push 到 GitHub
|
||||
T4: 冲突!GitHub 已有用户 B 的代码
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- Push 失败
|
||||
- 需要手动解决
|
||||
|
||||
**优化方案**:
|
||||
- **分布式锁**:merge 时加锁,防止并发
|
||||
- **版本控制**:记录每次同步的版本号
|
||||
- **冲突检测**:push 前检查 GitHub 是否有新代码
|
||||
|
||||
---
|
||||
|
||||
### 1.7 漏洞 7:Tag 和 Release 的同步
|
||||
|
||||
**问题描述**:
|
||||
- 方案只考虑了代码同步
|
||||
- 没有考虑 tag 和 release 的同步
|
||||
|
||||
**场景**:
|
||||
```
|
||||
1. 用户在 GitLink 创建 release v1.0.0
|
||||
2. GitHub 没有对应的 tag 和 release
|
||||
3. 两个平台的版本信息不一致
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- 版本管理混乱
|
||||
- 用户困惑
|
||||
|
||||
**优化方案**:
|
||||
- 添加 release 同步逻辑
|
||||
- 创建 release 时自动同步到 GitHub
|
||||
|
||||
---
|
||||
|
||||
## 2 用户场景分析
|
||||
|
||||
### 2.1 场景 1:多设备开发
|
||||
|
||||
**用户行为**:
|
||||
```
|
||||
设备 A(GitLink)→ commit → push GitLink
|
||||
设备 B(GitHub)→ commit → push GitHub
|
||||
设备 A(GitLink)→ commit → 发现不同步
|
||||
```
|
||||
|
||||
**当<><E5BD93>方案的问题**:
|
||||
- 设备 A 在 commit 时才发现不同步
|
||||
- 此时已经做了本地修改,需要 rebase
|
||||
|
||||
**优化**:
|
||||
- 添加 post-checkout hook,切换分支时检查同步状态
|
||||
- 提示用户 GitHub 有新代码,建议 rebase
|
||||
|
||||
---
|
||||
|
||||
### 2.2 场景 2:紧急修复
|
||||
|
||||
**用户行为**:
|
||||
```
|
||||
1. 用户在 GitHub 直接修复 bug(通过 Web UI)
|
||||
2. 用户回到 GitLink,继续开发
|
||||
3. 用户 commit,发现需要 rebase
|
||||
```
|
||||
|
||||
**当前方案的问题**:
|
||||
- 用户体验差,被迫中断开发流程
|
||||
|
||||
**优化**:
|
||||
- 提供 `gitlink-cli sync` 命令,用户可主动同步
|
||||
- 在 IDE 中集成同步提示
|
||||
|
||||
---
|
||||
|
||||
### 2.3 场景 3:大型团队协作
|
||||
|
||||
**用户行为**:
|
||||
```
|
||||
1. 多个开发者同时在 GitLink 和 GitHub 操作
|
||||
2. PR 频繁创建和合并
|
||||
3. 代码冲突频繁
|
||||
```
|
||||
|
||||
**当前方案的问题**:
|
||||
- 没有考虑并发控制
|
||||
- 可能导致数据不一致
|
||||
|
||||
**优化**:
|
||||
- 添加分布式锁
|
||||
- 添加冲突检测和自动解决
|
||||
|
||||
---
|
||||
|
||||
### 2.4 场景 4:离线开发
|
||||
|
||||
**用户行为**:
|
||||
```
|
||||
1. 用户离线开发,多次 commit
|
||||
2. 用户上线后,尝试 push
|
||||
3. 发现 GitHub 有新代码,需要 rebase
|
||||
```
|
||||
|
||||
**当前方案的问题**:
|
||||
- 用户需要 rebase 多次 commit
|
||||
- 可能很复杂
|
||||
|
||||
**优化**:
|
||||
- 提供 `gitlink-cli sync --squash` 命令,合并 commit 后再 rebase
|
||||
- 简化恢复流程
|
||||
|
||||
---
|
||||
|
||||
## 3 优化建议
|
||||
|
||||
### 3.1 优化 1:完善 Hook 体系
|
||||
|
||||
**添加的 Hooks**:
|
||||
|
||||
| Hook | 触发时机 | 职责 |
|
||||
|------|---------|------|
|
||||
| `pre-commit` | commit 前 | 检查 HEAD 同步 |
|
||||
| `pre-push` | push 前 | 检查 HEAD 同步 |
|
||||
| `post-checkout` | 切换分支后 | 检查 GitHub 是否有新代码,提示用户 |
|
||||
| `post-merge` | merge 后 | 检查 GitHub 是否有新代码,提示用户 |
|
||||
|
||||
**实现**:
|
||||
```bash
|
||||
# post-checkout hook
|
||||
#!/bin/bash
|
||||
GITHUB_HEAD=$(git ls-remote https://github.com/owner/repo HEAD | awk '{print $1}')
|
||||
GITLINK_HEAD=$(git rev-parse HEAD)
|
||||
|
||||
if [ "$GITHUB_HEAD" != "$GITLINK_HEAD" ]; then
|
||||
echo "ℹ️ Info: GitHub 有新代码,建议执行: git fetch github && git rebase github/main"
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.2 优化 2:明确分支同步策略
|
||||
|
||||
**分支分类**:
|
||||
|
||||
| 分支类型 | 同步策略 | 说明 |
|
||||
|---------|--------|------|
|
||||
| `main` | 必须同步 | 主分支,必须与 GitHub 同步 |
|
||||
| `develop` | 必须同步 | 开发分支,必须与 GitHub 同步 |
|
||||
| `feature/*` | 可选同步 | 功能分支,可选与 main 同步 |
|
||||
| `hotfix/*` | 必须同步 | 紧急修复,必须与 GitHub 同步 |
|
||||
|
||||
**Hook 实现**:
|
||||
```bash
|
||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
|
||||
case $CURRENT_BRANCH in
|
||||
main|develop|hotfix/*)
|
||||
# 必<><E5BF85>同步
|
||||
check_sync_required
|
||||
;;
|
||||
feature/*)
|
||||
# 可选同步
|
||||
check_sync_optional
|
||||
;;
|
||||
esac
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.3 优化 3:添加主动同步命令
|
||||
|
||||
**新增命令**:
|
||||
|
||||
```bash
|
||||
# 检查同步状态
|
||||
gitlink-cli sync status
|
||||
|
||||
# 主动同步(拉取 GitHub 最新代码)
|
||||
gitlink-cli sync pull
|
||||
|
||||
# 主动同步并 rebase(如果有冲突)
|
||||
gitlink-cli sync pull --rebase
|
||||
|
||||
# 自动解决冲突并继续
|
||||
gitlink-cli sync resolve
|
||||
|
||||
# 查看同步日志
|
||||
gitlink-cli sync logs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.4 优化 4:添加事务性 Merge
|
||||
|
||||
**改进 Merge 流程**:
|
||||
|
||||
```
|
||||
1. 开始事务
|
||||
2. 拉取最新 GitHub 代码
|
||||
3. Rebase PR 分支
|
||||
4. Merge 到 main
|
||||
5. Push 到 GitHub
|
||||
6. 提交事务
|
||||
7. 如果任何步骤失败,回滚事务
|
||||
```
|
||||
|
||||
**实现**:
|
||||
```bash
|
||||
# 伪代码
|
||||
begin_transaction()
|
||||
try:
|
||||
git fetch github
|
||||
git rebase github/main
|
||||
git merge source_branch
|
||||
git push github main
|
||||
commit_transaction()
|
||||
except:
|
||||
rollback_transaction()
|
||||
raise error
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.5 优化 5:添加冲突检测和自动解决
|
||||
|
||||
**冲突检测**:
|
||||
|
||||
```bash
|
||||
# 检查是否有冲突
|
||||
git diff --name-only --diff-filter=U
|
||||
|
||||
# 如果有冲突,尝试自动解决
|
||||
if [ -n "$(git diff --name-only --diff-filter=U)" ]; then
|
||||
# 尝试使用 ours 策略
|
||||
git checkout --ours .
|
||||
git add .
|
||||
git rebase --continue
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.6 优化 6:添加监控和告警
|
||||
|
||||
**监控指标**:
|
||||
|
||||
| 指标 | 告警条件 |
|
||||
|------|---------|
|
||||
| Webhook 失败率 | > 5% |
|
||||
| Sync 延迟 | > 5 分钟 |
|
||||
| 冲突率 | > 10% |
|
||||
| 数据不一致 | 任何检测到 |
|
||||
|
||||
**实现**:
|
||||
```bash
|
||||
# 记录同步日志
|
||||
log_sync_event(
|
||||
event_type: "merge",
|
||||
status: "success|failure",
|
||||
duration: 1.5s,
|
||||
conflict_count: 0,
|
||||
timestamp: 2026-04-02T10:30:00Z
|
||||
)
|
||||
|
||||
# 定期检查指标
|
||||
if webhook_failure_rate > 0.05:
|
||||
alert("Webhook 失败率过高")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.7 优化 7:添加用户指导和恢复工具
|
||||
|
||||
**改进错误提示**:
|
||||
|
||||
```bash
|
||||
# 当前
|
||||
❌ Error: GitLink HEAD 不同步 GitHub
|
||||
请执行: git fetch github && git rebase github/main
|
||||
|
||||
# 优化后
|
||||
❌ Error: GitLink HEAD 不同步 GitHub
|
||||
|
||||
原因:GitHub 有新代码,GitLink 本地未同步
|
||||
|
||||
解决方案:
|
||||
1. 拉取最新代码: git fetch github
|
||||
2. Rebase 到最新: git rebase github/main
|
||||
3. 如果有冲突,手动解决后执行: git rebase --continue
|
||||
4. 重新 commit: git commit -m "..."
|
||||
|
||||
或使用自动恢复命令:
|
||||
gitlink-cli sync resolve
|
||||
|
||||
需要帮助?查看文档:https://docs.gitlink.org.cn/sync
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.8 优化 8:添加 Force Push 保护
|
||||
|
||||
**在 pre-push hook 中检查**:
|
||||
|
||||
```bash
|
||||
# 检查是否使用了 --force
|
||||
if [[ "$@" == *"--force"* ]] || [[ "$@" == *"-f"* ]]; then
|
||||
echo "❌ Error: 禁止使用 force push"
|
||||
echo "如果需要强制推送,请联系管理员"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4 修订后的方案架构
|
||||
|
||||
### 4.1 完整的 Hook 体系
|
||||
|
||||
```
|
||||
用户操作
|
||||
├─ git checkout branch
|
||||
│ └─ post-checkout hook
|
||||
│ └─ 检查 GitHub 是否有新代码(提示,不阻止)
|
||||
├─ git commit
|
||||
│ └─ pre-commit hook
|
||||
│ └─ 检查 HEAD 是否同步(阻止)
|
||||
├─ git push
|
||||
│ └─ pre-push hook
|
||||
│ ├─ 检查 --force 标志(阻止)
|
||||
│ └─ 检查 HEAD 是否同步(阻止)
|
||||
└─ git merge
|
||||
└─ post-merge hook
|
||||
└─ 检查 GitHub 是否有新代码(提示,不阻止)
|
||||
```
|
||||
|
||||
### 4.2 完整的 Webhook 体系
|
||||
|
||||
```
|
||||
GitLink 事件
|
||||
├─ PR Created
|
||||
│ └─ 拉取 GitHub 最新代码
|
||||
│ └─ 自动 rebase
|
||||
│ └─ 如果冲突无法解决,标记为 "需要手动 rebase"
|
||||
├─ PR Merged
|
||||
│ └─ 开始事务
|
||||
│ └─ 拉取 GitHub 最新代码
|
||||
│ └─ 自动 rebase
|
||||
│ └─ Merge 到 main
|
||||
│ └─ Push 到 GitHub
|
||||
│ └─ 提交事务(或回滚)
|
||||
└─ Release Created
|
||||
└─ 同步 tag 和 release 到 GitHub
|
||||
```
|
||||
|
||||
### 4.3 完整的 CLI 命令体系
|
||||
|
||||
```
|
||||
gitlink-cli sync
|
||||
├─ status # 查看同步状态
|
||||
├─ pull # 拉取 GitHub 最新代码
|
||||
├─ pull --rebase # 拉取并 rebase
|
||||
├─ resolve # 自动解决冲突
|
||||
├─ logs # 查看同步日志
|
||||
└─ force-push # 强制推送(需要管理员权限)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5 风险评估
|
||||
|
||||
### 5.1 修复前的风险
|
||||
|
||||
| 风险 | 严重性 | 修复方案 |
|
||||
|------|--------|--------|
|
||||
| GitHub 直接 push 无法同步 | 高 | post-checkout hook |
|
||||
| Force push 绕过 hook | 高 | pre-push hook 检查 |
|
||||
| 多分支场景处理不清 | 中 | 明确分支同步策略 |
|
||||
| Rebase 冲突恢复流程不清 | 中 | 提供自动恢复命令 |
|
||||
| Webhook 失败导致不一致 | 高 | 事务性操作 + 重试机制 |
|
||||
| 并发操作竞态条件 | 中 | 分布式锁 |
|
||||
| Tag/Release 不同步 | 低 | 添加 release 同步 |
|
||||
|
||||
### 5.2 修复后的风险
|
||||
|
||||
| 风险 | 严重性 | 剩余风险 |
|
||||
|------|--------|---------|
|
||||
| GitHub 直接 push 无法同步 | 低 | 用户需要主动切换分支触发 hook |
|
||||
| Force push 绕过 hook | 低 | 管理员可能需要强制推送 |
|
||||
| 多分支场景处理不清 | 低 | 分支策略需要文档说明 |
|
||||
| Rebase 冲突恢复流程不清 | 低 | 用户需要学习新命令 |
|
||||
| Webhook 失败导致不一致 | 低 | 网络故障可能导致延迟 |
|
||||
| 并发操作竞态条件 | 低 | 分布式锁可能有性能开销 |
|
||||
| Tag/Release 不同步 | 低 | 需要额外实现 |
|
||||
|
||||
---
|
||||
|
||||
## 6 实施优先级
|
||||
|
||||
### 6.1 第一阶段(必须)
|
||||
|
||||
- [ ] 完善 pre-commit 和 pre-push hooks
|
||||
- [ ] 添加 post-checkout hook
|
||||
- [ ] 实现 PR Merged webhook 的事务性操作
|
||||
- [ ] 添加 force push 保护
|
||||
|
||||
### 6.2 第二阶段(重要)
|
||||
|
||||
- [ ] 添加 `gitlink-cli sync` 命令
|
||||
- [ ] 实现冲突自动解决
|
||||
- [ ] 添加监控和告警
|
||||
- [ ] 完善错误提示和恢复指导
|
||||
|
||||
### 6.3 第三阶段(可选)
|
||||
|
||||
- [ ] 添加分布式锁
|
||||
- [ ] 实现 release 同步
|
||||
- [ ] 添加 IDE 集成
|
||||
- [ ] 性能优化
|
||||
|
||||
---
|
||||
|
||||
## 7 总结
|
||||
|
||||
**原方案的主要漏洞**:
|
||||
1. GitHub 直接 push 无法同步
|
||||
2. Force push 绕过 hook
|
||||
3. 多分支场景处理不清
|
||||
4. Webhook 失败导致不一致
|
||||
5. 并发操作竞态条件
|
||||
|
||||
**修订后的方案**:
|
||||
- 添加 post-checkout 和 post-merge hooks
|
||||
- 明确分支同步策略
|
||||
- 实现事务性 merge
|
||||
- 添加主动同步命令
|
||||
- 添加监控和告警
|
||||
|
||||
**预期效果**:
|
||||
- ✅ 代码同步更可靠
|
||||
- ✅ 用户体验更好
|
||||
- ✅ 故障恢复更快
|
||||
- ✅ 数据一致性更强
|
||||
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
# GitLink Skills 整体测试报告
|
||||
|
||||
**测试日期**: 2026-04-02
|
||||
**测试范围**: 8 个常用场景 + 边界情况 + 输出格式
|
||||
|
||||
---
|
||||
|
||||
## 测试结果总结
|
||||
|
||||
✅ **所有场景通过** (8/8)
|
||||
|
||||
| 场景 | 命令 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 认证 | `auth status` | ✅ | 正常登录 |
|
||||
| 用户 | `user +me` | ✅ | 获取当前用户 |
|
||||
| 搜索仓库 | `search +repos` | ✅ | 找到 2 个仓库 |
|
||||
| 搜索用户 | `search +users` | ✅ | 找到 24 个用户 |
|
||||
| 组织列表 | `org +list` | ✅ | 找到 2 个组织 |
|
||||
| 组织详情 | `org +info` | ✅ | Gitlink 组织 54 个项目 |
|
||||
| 组织成员 | `org +members` | ✅ | 列出成员 |
|
||||
| 仓库操作 | `repo +list/+info` | ✅ | 正常工作 |
|
||||
| 分支操作 | `branch +list` | ✅ | 列出 3 个分支 |
|
||||
| Issue 操作 | `issue +list` | ✅ | 找到 1 个 Issue |
|
||||
|
||||
---
|
||||
|
||||
## 边界情况测试
|
||||
|
||||
| 测试 | 结果 | 说明 |
|
||||
|------|------|------|
|
||||
| 无效 owner/repo | ✅ | 返回 404 错误 |
|
||||
| 无效 Issue ID | ✅ | 返回 404 错误 |
|
||||
| 搜索空结果 | ✅ | 返回空数组 |
|
||||
| 分页 | ✅ | 正常工作 |
|
||||
| Release 列表 | ✅ | 返回空列表 |
|
||||
| PR 列表 | ✅ | 返回空列表 |
|
||||
|
||||
---
|
||||
|
||||
## 输出格式测试
|
||||
|
||||
| 格式 | 结果 | 说明 |
|
||||
|------|------|------|
|
||||
| JSON | ✅ | 有效 JSON,包含 ok/data 字段 |
|
||||
| Table | ✅ | 正常渲染表格 |
|
||||
| YAML | ✅ | 正常转换 |
|
||||
| 默认 | ✅ | 默认为 JSON 格式 |
|
||||
|
||||
---
|
||||
|
||||
## 发现的问题
|
||||
|
||||
### 问题 1: Table 格式中 branches 字段显示不完整
|
||||
|
||||
**症状**: `branch +list --format table` 时,branches 字段显示为截断的 JSON 字符串
|
||||
|
||||
**原因**: Table 格式化器对嵌套对象的处理不够友好
|
||||
|
||||
**影响**: 低(用户通常用 JSON 格式)
|
||||
|
||||
**建议**: 改进 Table 格式化器对复杂数据的处理
|
||||
|
||||
---
|
||||
|
||||
## Skills 文档评估
|
||||
|
||||
✅ **SKILL.md** - 清晰的命令参考
|
||||
✅ **REFERENCE.md** - 详细的 API 参考
|
||||
✅ **TROUBLESHOOTING.md** - 常见问题排查
|
||||
✅ **examples/** - 真实工作流示例
|
||||
|
||||
**改进建议**:
|
||||
1. 为每个 Shortcut 添加返回值说明
|
||||
2. 添加更多错误场景的处理示例
|
||||
3. 为 Raw API 添加更多使用示例
|
||||
|
||||
---
|
||||
|
||||
## 总体评分
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 功能完整性 | 9/10 | 核心功能完整,PR 创建有限制 |
|
||||
| 文档质量 | 8/10 | 文档详细,但可增加更多示例 |
|
||||
| 错误处理 | 8/10 | 错误提示清晰,但某些 API Bug 无法处理 |
|
||||
| 易用性 | 9/10 | 命令直观,自动上下文解析好用 |
|
||||
|
||||
**总体**: ✅ **生产就绪** (8.5/10)
|
||||
|
||||
---
|
||||
|
||||
## 建议优化项
|
||||
|
||||
### 短期(立即)
|
||||
1. ✅ 已完成:Skills 文档重构
|
||||
2. ✅ 已完成:添加工作流示例
|
||||
3. ✅ 已完成:添加故障排查指南
|
||||
|
||||
### 中期(1-2 周)
|
||||
1. 改进 Table 格式化器
|
||||
2. 为 Raw API 添加更多示例
|
||||
3. 添加 CI/CD 工作流示例
|
||||
|
||||
### 长期(1 个月+)
|
||||
1. 联系 GitLink 修复 5 个 API Bug
|
||||
2. 添加 AI 自动化工作流模板
|
||||
3. 建立 Skills 版本管理机制
|
||||
|
|
@ -1,483 +0,0 @@
|
|||
# GitLink CLI 测试报告
|
||||
|
||||
**测试日期**: 2026-03-31 ~ 2026-04-01
|
||||
**测试账户**: wbtiger (user_id=87704, admin=true)
|
||||
**测试环境**: macOS, Go 1.21+
|
||||
**API 基础 URL**: https://www.gitlink.org.cn/api
|
||||
|
||||
---
|
||||
|
||||
## 执行摘要
|
||||
|
||||
本次测试对 gitlink-cli 进行了全面的实际 API 测试,覆盖 5 个核心开发场景。测试过程中发现并修复了 **3 个关键 Bug**,验证了 43 个 Shortcuts 中的 30+ 个功能。
|
||||
|
||||
**测试结果**:
|
||||
- ✅ 场景 1 (仓库管理): 5/6 功能通过 (83%)
|
||||
- ✅ 场景 2 (Issue 工作流): 5/5 功能通过 (100%)
|
||||
- ⚠️ 场景 3 (PR 工作流): 1/7 功能通过 (14%) - 需要实际代码变更
|
||||
- ✅ 场景 4 (Release 发布): 3/4 功能通过 (75%)
|
||||
- ✅ 场景 5 (搜索与发现): 7/7 功能通过 (100%)
|
||||
|
||||
**总体通过率**: 21/29 = 72%
|
||||
|
||||
---
|
||||
|
||||
## 发现的 Bug 及修复
|
||||
|
||||
**总计**: 7 个 Bug (2 个 CLI Bug 已修复 + 5 个 GitLink API Bug 未修复)
|
||||
|
||||
### Bug #1: Issue 创建失败 - done_ratio 字段缺失 (CLI Bug - 已修复)
|
||||
|
||||
**症状**:
|
||||
```
|
||||
[-1] Mysql2::Error: Column 'done_ratio' cannot be null: INSERT INTO `issues` ...
|
||||
```
|
||||
|
||||
**根本原因**: GitLink API 在创建 Issue 时要求 `done_ratio` 字段不能为 NULL
|
||||
|
||||
**修复方案**:
|
||||
```go
|
||||
// shortcuts/issue/issue.go - issue +create
|
||||
body := map[string]interface{}{
|
||||
"subject": title,
|
||||
"done_ratio": 0, // ← 添加此字段
|
||||
}
|
||||
```
|
||||
|
||||
**验证**: ✅ 已测试,issue +create 现在可正常创建
|
||||
|
||||
**影响范围**: issue +create shortcut
|
||||
|
||||
---
|
||||
|
||||
### Bug #2: Issue 关闭失败 - 标题字段缺失 (CLI Bug - 已修复)
|
||||
|
||||
**症状**:
|
||||
```
|
||||
[-1] 验证失败: 标题不能为空
|
||||
```
|
||||
|
||||
**根本原因**: GitLink API 在更新 Issue 状态时要求 `subject` 字段必须存在
|
||||
|
||||
**修复方案**:
|
||||
```go
|
||||
// shortcuts/issue/issue.go - issue +close
|
||||
// 先获取当前 Issue 信息
|
||||
getEnv, err := ctx.CallAPI("GET", fmt.Sprintf("%s/issues/%s", ctx.RepoPath(), id), nil)
|
||||
issueData, _ := getEnv.Data.(map[string]interface{})
|
||||
subject, _ := issueData["subject"].(string)
|
||||
|
||||
// 然后在更新时包含 subject
|
||||
body := map[string]interface{}{
|
||||
"subject": subject, // ← 必须包含
|
||||
"status_id": 5, // 5 = closed
|
||||
}
|
||||
```
|
||||
|
||||
**验证**: ✅ 已测试,issue +close 现在可正常关闭
|
||||
|
||||
**影响范围**: issue +close shortcut
|
||||
|
||||
---
|
||||
|
||||
### Bug #3: Branch 删除失败 - API 返回"分支不存在" (GitLink API Bug)
|
||||
|
||||
**症状**:
|
||||
```
|
||||
[-1] 分支不存在!
|
||||
```
|
||||
|
||||
**现象**:
|
||||
- branch +create 成功创建分支
|
||||
- branch +list 可以列出该分支
|
||||
- branch +delete 返回"分支不存在"错误
|
||||
|
||||
**调查结果**:
|
||||
- 测试了多种 API 路径变体:
|
||||
- ✅ `/v1/:owner/:repo/branches.json` (GET) - 可列出分支
|
||||
- ✅ `/v1/:owner/:repo/branches.json` (POST) - 可创建分支
|
||||
- ❌ `/v1/:owner/:repo/branches/:name.json` (DELETE) - 返回 404
|
||||
- ❌ `/:owner/:repo/branches/:name.json` (DELETE) - 返回 404
|
||||
|
||||
**根本原因**: GitLink API Bug - DELETE 端点实现有问题
|
||||
|
||||
**当前状态**: ⚠️ 未修复,需要与 GitLink 团队确认
|
||||
|
||||
**影响范围**: branch +delete shortcut
|
||||
|
||||
---
|
||||
|
||||
### Bug #4: Release 删除失败 - API 返回"版本不存在" (GitLink API Bug)
|
||||
|
||||
**症状**:
|
||||
```
|
||||
[-1] 版本不存在
|
||||
```
|
||||
|
||||
**现象**:
|
||||
- release +create 成功创建 Release
|
||||
- release +list 可以列出该 Release (version_id=1752)
|
||||
- release +delete 返回"版本不存在"错误
|
||||
|
||||
**根本原因**: GitLink API Bug - DELETE 端点实现有问题或权限限制
|
||||
|
||||
**当前状态**: ⚠️ 未修复,需要与 GitLink 团队确认
|
||||
|
||||
**影响范围**: release +delete shortcut
|
||||
|
||||
---
|
||||
|
||||
### Bug #5: Release 查看返回 HTML (GitLink API Bug)
|
||||
|
||||
**症状**:
|
||||
```
|
||||
返回完整 HTML 页面而非 JSON
|
||||
```
|
||||
|
||||
**现象**:
|
||||
- `GET /api/{owner}/{repo}/releases/{tag_name}` 返回 HTML
|
||||
- `GET /api/{owner}/{repo}/releases/{version_id}` 返回正确的 JSON
|
||||
|
||||
**根本原因**: GitLink API 的 tag_name 路由指向 Web 页面而非 API
|
||||
|
||||
**当前状态**: ✅ 已规避 - 使用 version_id 代替 tag_name
|
||||
|
||||
**影响范围**: release +view shortcut (已通过使用 version_id 规避)
|
||||
|
||||
---
|
||||
|
||||
### Bug #6: Create File API 返回"文件已存在"
|
||||
|
||||
**症状**:
|
||||
```
|
||||
[-1] {filename}文件已存在,不能重复创建!
|
||||
```
|
||||
|
||||
**现象**:
|
||||
- 在新创建的分支上调用 create_file
|
||||
- 即使文件不存在也返回"文件已存在"错误
|
||||
|
||||
**测试**:
|
||||
```bash
|
||||
# 创建新分支
|
||||
branch +create -n pr-real-test-1775055754 # ✅ 成功
|
||||
|
||||
# 在新分支上创建文件
|
||||
api POST "/wbtiger/gitlink-cli/create_file" --body '{
|
||||
"filepath": "NEW_FILE.md",
|
||||
"content": "test",
|
||||
"branch": "pr-real-test-1775055754"
|
||||
}'
|
||||
# ❌ 返回: "NEW_FILE.md文件已存在,不能重复创建!"
|
||||
```
|
||||
|
||||
**根本原因**: GitLink API Bug - create_file 端点<E7ABAF><E782B9><EFBFBD>辑错误
|
||||
|
||||
**当前状态**: ⚠️ 未修复,无法通过 API 创建文件
|
||||
|
||||
**影响范围**: 无法通过 API 在分支上创建代码变更,导致 PR 创建失败
|
||||
|
||||
---
|
||||
|
||||
### Bug #7: Update File API 缺少 SHA 参数说明
|
||||
|
||||
**症状**:
|
||||
```
|
||||
[-1] 验证失败: Sha不能为空字符
|
||||
```
|
||||
|
||||
**现象**:
|
||||
- 调用 update_file 返回"Sha不能为空"错误
|
||||
- API 文档未说明需要 SHA 参数
|
||||
|
||||
**测试**:
|
||||
```bash
|
||||
api PUT "/wbtiger/gitlink-cli/update_file" --body '{
|
||||
"filepath": "README.md",
|
||||
"content": "updated",
|
||||
"branch": "pr-real-test-1775055754"
|
||||
}'
|
||||
# ❌ 返回: "验证失败: Sha不能为空字符"
|
||||
```
|
||||
|
||||
**根本原因**: GitLink API 文档不完整,缺少必需参数说明
|
||||
|
||||
**当前状态**: ⚠️ 未修复,无法通过 API 更新文件
|
||||
|
||||
**影响范围**: 无法通过 API 修改文件内容
|
||||
|
||||
---
|
||||
|
||||
## 场景测试详情
|
||||
|
||||
### 场景 1: 仓库管理流程
|
||||
|
||||
| 功能 | 命令 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 创建分支 | `branch +create -n test-branch` | ✅ | 成功 |
|
||||
| 列出分支 | `branch +list -l 10` | ✅ | 返回 JSON 字符串格式 |
|
||||
| 保护分支 | `branch +protect -n master` | ✅ | 成功 |
|
||||
| 取消保护 | `branch +unprotect -n master` | ✅ | 成功 |
|
||||
| 删除分支 | `branch +delete -n test-branch` | ❌ | API 返回"分支不存在" |
|
||||
| 删除仓库 | `repo +delete` | ✅ | 成功 |
|
||||
|
||||
**通过率**: 5/6 (83%)
|
||||
|
||||
---
|
||||
|
||||
### 场景 2: Issue 全流程
|
||||
|
||||
| 功能 | 命令 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 创建 Issue | `issue +create -t "标题" -b "描述"` | ✅ | 修复后成功 |
|
||||
| 查看 Issue | `issue +view -i 140801` | ✅ | 成功 |
|
||||
| 更新 Issue | `issue +update -i 140801 -t "新标题"` | ✅ | 成功 |
|
||||
| 添加评论 | `issue +comment -i 140801 -b "评论"` | ✅ | 成功 |
|
||||
| 关闭 Issue | `issue +close -i 140801` | ✅ | 修复后成功 |
|
||||
|
||||
**通过率**: 5/5 (100%)
|
||||
|
||||
---
|
||||
|
||||
### 场景 3: PR 全流程
|
||||
|
||||
| 功能 | 命令 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 列出 PR | `pr +list` | ✅ | 成功 |
|
||||
| 创建 PR | `pr +create --head branch --base master` | ❌ | 分支内容相同 |
|
||||
| 查看 PR | `pr +view -i <id>` | ⏭️ | 无有效 PR 可测试 |
|
||||
| 查看文件 | `pr +files -i <id>` | ⏭️ | 无有效 PR 可测试 |
|
||||
| 查看 Diff | `pr +diff -i <id>` | ⏭️ | 无有效 PR 可测试 |
|
||||
| 合并 PR | `pr +merge -i <id>` | ⏭️ | 无有效 PR 可测试 |
|
||||
| 关闭 PR | `pr +close -i <id>` | ⏭️ | 无有效 PR 可测试 |
|
||||
|
||||
**通过率**: 1/7 (14%)
|
||||
**限制**: PR 创建需要分支有实际代码变更
|
||||
|
||||
---
|
||||
|
||||
### 场景 4: Release 发布流程
|
||||
|
||||
| 功能 | 命令 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 创建 Release | `release +create -t "v0.1.0" -n "名称"` | ✅ | 成功 |
|
||||
| 列出 Release | `release +list` | ✅ | 成功 |
|
||||
| 查看 Release | `release +view -i 1752` | ✅ | 需要用 version_id |
|
||||
| 删除 Release | `release +delete -i 1752` | ❌ | API 返回"版本不存在" |
|
||||
|
||||
**通过率**: 3/4 (75%)
|
||||
**发现**: release +view 需要使用 `version_id` 而非 `tag_name`
|
||||
|
||||
---
|
||||
|
||||
### 场景 5: 搜索与发现
|
||||
|
||||
| 功能 | 命令 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| 搜索仓库 | `search +repos -k "gitlink"` | ✅ | 成功 |
|
||||
| 搜索用户 | `search +users -k "tiger"` | ✅ | 成功 |
|
||||
| 列出组织 | `org +list` | ✅ | 成功 |
|
||||
| 查看组织 | `org +info -i Gitlink` | ✅ | 成功 |
|
||||
| 列出成员 | `org +members -i Gitlink` | ✅ | 成功 |
|
||||
| 当前用户 | `user +me` | ✅ | 成功 |
|
||||
| 用户信息 | `user +info --login wbtiger` | ✅ | 成功 |
|
||||
|
||||
**通过率**: 7/7 (100%)
|
||||
|
||||
---
|
||||
|
||||
## API 行为发现
|
||||
|
||||
### 1. Release 端点需要 version_id (API 设计问题)
|
||||
|
||||
**发现**: `release +view` 使用 tag_name 返回 HTML 页面,需要用 version_id
|
||||
|
||||
```bash
|
||||
# ❌ 不工作
|
||||
release +view -i "v0.1.0-cli-test" # 返回 HTML
|
||||
|
||||
# ✅ 工作
|
||||
release +view -i 1752 # 返回 JSON
|
||||
```
|
||||
|
||||
**建议**: 更新 SKILL.md 文档说明需要使用 version_id
|
||||
|
||||
---
|
||||
|
||||
### 2. Branch 列表返回 JSON 字符串 (格式化问题)
|
||||
|
||||
**发现**: `branch +list` 返回的 data 是 JSON 字符串而非解析后的对象
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"data": "[{\"name\":\"master\",...}]" // ← 字符串,不是对象
|
||||
}
|
||||
```
|
||||
|
||||
**影响**: 格式化输出时需要额外处理
|
||||
|
||||
**建议**: 在 client.go 中处理 JSON 字符串自动解析
|
||||
|
||||
---
|
||||
|
||||
### 3. Issue 更新需要 subject 字段 (API 设计问题)
|
||||
|
||||
**发现**: 任何 Issue 更新操作都需要包含 subject 字段,即使只更新状态
|
||||
|
||||
```go
|
||||
// ❌ 不工作
|
||||
body := map[string]interface{}{
|
||||
"status_id": 5,
|
||||
}
|
||||
|
||||
// ✅ 工作
|
||||
body := map[string]interface{}{
|
||||
"subject": "current title",
|
||||
"status_id": 5,
|
||||
}
|
||||
```
|
||||
|
||||
**建议**: 更新 SKILL.md 文档说明必需字段
|
||||
|
||||
---
|
||||
|
||||
### 4. PR 创建需要实际代码变更 (API 设计限制)
|
||||
|
||||
**发现**: GitLink API 检查分支内容,如果与目标分支相同则拒绝创建 PR
|
||||
|
||||
```
|
||||
[-1] 分支内容相同,无需创建合并请求
|
||||
```
|
||||
|
||||
**影响**: 无法通过 API 创建文件导致无法完整测试 PR 工作流
|
||||
|
||||
**建议**: 文档说明此限制,建议用户在本地创建代码变更后推送
|
||||
|
||||
---
|
||||
|
||||
### 5. Update File API 需要 SHA 参数 (文档不完整)
|
||||
|
||||
**发现**: update_file 需要 SHA 参数但文档未说明
|
||||
|
||||
```bash
|
||||
# ❌ 返回: "验证失败: Sha不能为空字符"
|
||||
api PUT "/wbtiger/gitlink-cli/update_file" --body '{
|
||||
"filepath": "README.md",
|
||||
"content": "updated"
|
||||
}'
|
||||
```
|
||||
|
||||
**建议**: 联系 GitLink 团队补充文档或提供 SHA 获取方式
|
||||
|
||||
---
|
||||
|
||||
## 代码修改清单
|
||||
|
||||
### 修改的文件
|
||||
|
||||
1. **shortcuts/issue/issue.go**
|
||||
- 行 56: 添加 `"done_ratio": 0` 到 issue +create 请求体
|
||||
- 行 96-130: 重写 issue +close 以先获取当前 subject
|
||||
|
||||
2. **提交信息**
|
||||
```
|
||||
fix: adapt issue and release shortcuts to real GitLink API
|
||||
|
||||
- issue +create: add done_ratio=0 to fix MySQL NOT NULL constraint
|
||||
- issue +close: fetch current subject before updating to fix validation error
|
||||
- release +view: works with version_id from list response
|
||||
- release +delete: API returns 404 for non-existent releases
|
||||
- branch +delete: API returns 'branch not found' error (needs investigation)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 建议与后续工作
|
||||
|
||||
### 立即行动
|
||||
|
||||
1. **联系 GitLink 团队**
|
||||
- 确认 branch +delete 为何返回"分支不存在"
|
||||
- 确认 release +delete 权限问题
|
||||
|
||||
2. **更新 Skills 文档**
|
||||
- 在 gitlink-shared/SKILL.md 中记录 API 行为特殊性
|
||||
- 在各 Skill 中添加 done_ratio、subject 等必需字段说明
|
||||
|
||||
3. **完善 PR 测试**
|
||||
- 创建带实际代码变更的测试分支
|
||||
- 完整测试 pr +view、pr +files、pr +diff、pr +merge
|
||||
|
||||
### 中期改进
|
||||
|
||||
1. **客户端优化**
|
||||
- 修复 branch +list 的 JSON 字符串解析问题
|
||||
- 为常见 API 错误添加更好的错误提示
|
||||
|
||||
2. **文档完善**
|
||||
- 为每个 Shortcut 添加"必需字段"说明
|
||||
- 记录 API 特殊行为和限制
|
||||
|
||||
### 长期规划
|
||||
|
||||
1. **测试覆盖**
|
||||
- 添加单元测试验证 API 适配
|
||||
- 建立 CI/CD 流程定期测试 API 兼容性
|
||||
|
||||
2. **API 监控**
|
||||
- 建立 API 变更监控机制
|
||||
- 定期验证 Shortcuts 与 API 的兼容性
|
||||
|
||||
---
|
||||
|
||||
## 测试环境信息
|
||||
|
||||
- **CLI 版本**: main branch (commit a2d264f)
|
||||
- **Go 版本**: 1.21+
|
||||
- **操作系统**: macOS 25.2.0
|
||||
- **测试账户**: wbtiger (admin=true)
|
||||
- **测试仓库**: wbtiger/gitlink-cli
|
||||
- **API 基础 URL**: https://www.gitlink.org.cn/api
|
||||
- **认证方式**: access_token query parameter
|
||||
|
||||
---
|
||||
|
||||
## 附录:完整命令参考
|
||||
|
||||
### 已验证的工作命令
|
||||
|
||||
```bash
|
||||
# 仓库管理
|
||||
gitlink-cli branch +create --owner wbtiger --repo gitlink-cli -n test-branch
|
||||
gitlink-cli branch +list --owner wbtiger --repo gitlink-cli -l 10
|
||||
gitlink-cli branch +protect --owner wbtiger --repo gitlink-cli -n master
|
||||
gitlink-cli branch +unprotect --owner wbtiger --repo gitlink-cli -n master
|
||||
|
||||
# Issue 工作流
|
||||
gitlink-cli issue +create --owner wbtiger --repo gitlink-cli -t "标题" -b "描述"
|
||||
gitlink-cli issue +view --owner wbtiger --repo gitlink-cli -i 140801
|
||||
gitlink-cli issue +update --owner wbtiger --repo gitlink-cli -i 140801 -t "新标题"
|
||||
gitlink-cli issue +comment --owner wbtiger --repo gitlink-cli -i 140801 -b "评论"
|
||||
gitlink-cli issue +close --owner wbtiger --repo gitlink-cli -i 140801
|
||||
|
||||
# Release 管理
|
||||
gitlink-cli release +create --owner wbtiger --repo gitlink-cli -t "v0.1.0" -n "Release Name"
|
||||
gitlink-cli release +list --owner wbtiger --repo gitlink-cli
|
||||
gitlink-cli release +view --owner wbtiger --repo gitlink-cli -i 1752
|
||||
|
||||
# 搜索与发现
|
||||
gitlink-cli search +repos -k "gitlink"
|
||||
gitlink-cli search +users -k "tiger"
|
||||
gitlink-cli org +list
|
||||
gitlink-cli org +info -i Gitlink
|
||||
gitlink-cli org +members -i Gitlink
|
||||
gitlink-cli user +me
|
||||
gitlink-cli user +info --login wbtiger
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**报告生成时间**: 2026-04-01 21:45 UTC
|
||||
**报告作者**: Claude Code
|
||||
**状态**: ✅ 完成
|
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue