---
belongs_to:
  - "[[⚒️ 铸渊·协作指令｜GitHub ↔ Notion 桥接协议]]"
---
# 🌉 铸渊指令｜主仓库拉取同步 · Awen 仓库桥接修复方案

<aside>
🚨

**指令编号：ZY-BRIDGE-FIX-001**

**执行人：铸渊（GitHub 执行层）**

**签发人：冰朔（TCS-0002∞）**

**优先级：🟡 P1**

**问题：Awen 仓库 Actions 推送主仓库报 403 Permission denied**

</aside>

---

## 🔍 问题背景

Awen（DEV-012）的仓库 `WENZHUOXI/guanghu-awen` 通过 GitHub Actions 向主仓库 `qinfendebingshuo/guanghulab` 推送时，报错：

```
remote: Permission to qinfendebingshuo/guanghulab.git denied to qinfendebingshuo.
fatal: unable to access 'https://github.com/qinfendebingshuo/guanghulab.git/': The requested URL returned error: 403
```

**根因：** Classic PAT 从外部仓库的 Actions 运行环境推送到主仓库时，GitHub 拒绝了跨仓库写入。Token 本身有效且有 `repo` 权限，但 GitHub 的安全策略不允许这种跨仓库 Actions 推送。

**约束：** Token 不能换，其他开发者也在用同一个 Token。

---

## ✅ 解决方案：反转同步方向

**不让 Awen 的仓库推到主仓库，而是让主仓库主动拉取 Awen 的内容。**

推送动作发生在 `guanghulab` 自己的 Actions 里，不涉及跨仓库写入，不会触发 403。

---

## 🛠️ 执行步骤

### Step 1 · 在主仓库创建拉取工作流

在 `qinfendebingshuo/guanghulab` 仓库中创建文件：

`.github/workflows/pull-sync-awen.yml`

```yaml
# 🌉 光湖桥接拉取同步 · Awen 仓库
# 主仓库主动拉取 Awen 仓库内容到 federation/awen/
# 触发条件：定时 / 手动 / Awen 通过 repository_dispatch 触发

name: "🌉 Pull Sync from Awen"

on:
  # 定时拉取：每天 09:00 和 21:00 北京时间
  schedule:
    - cron: "0 1 * * *"   # UTC 01:00 = CST 09:00
    - cron: "0 13 * * *"  # UTC 13:00 = CST 21:00
  # 手动触发
  workflow_dispatch:
  # Awen 仓库可通过 API 触发
  repository_dispatch:
    types: [awen-sync]

jobs:
  pull-from-awen:
    runs-on: ubuntu-latest
    steps:
      - name: "📥 Checkout GuanghuLab"
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: "🌉 Pull Awen Repo Content"
        env:
          GH_TOKEN: $\{\{ secrets.MAIN_REPO_TOKEN \}\}
        run: |
          echo "🌊 光湖桥接拉取同步开始"
          echo "时间: $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S CST')"
          
          # 克隆 Awen 仓库
          git clone https://github.com/WENZHUOXI/guanghu-awen.git /tmp/awen-repo || {
            echo "⚠️ Awen 仓库为 Private，尝试用 Token 克隆"
            git clone https://x-access-token:${GH_TOKEN}@github.com/WENZHUOXI/guanghu-awen.git /tmp/awen-repo
          }
          
          # 创建同步目标目录
          mkdir -p federation/awen/workspace
          
          # 复制 Awen 仓库内容（排除 .git 和 .github）
          rsync -av --delete --exclude='.git' --exclude='.github' /tmp/awen-repo/ federation/awen/workspace/
          
          # 生成同步清单
          cat > federation/awen/latest-sync.json << EOF
          {
            "source": "WENZHUOXI/guanghu-awen",
            "synced_by": "guanghulab-pull-action",
            "timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
            "method": "pull-sync"
          }
          EOF
          
          echo "✅ 拉取完成"

      - name: "💾 Commit & Push"
        run: |
          git config user.name "guanghu-bridge-bot"
          git config user.email "bridge-bot@guanghu.dev"
          
          git add -A
          git diff --cached --quiet && echo "无变更，跳过" && exit 0
          git commit -m "🌉 [pull-sync] GuanghuLab ← Awen | $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M')"
          git push origin main
          
          echo "✅ 同步提交完成！"

      - name: "📝 Sync Summary"
        if: always()
        run: |
          echo "## 🌉 拉取同步结果" >> $GITHUB_STEP_SUMMARY
          echo "- 源仓库: WENZHUOXI/guanghu-awen" >> $GITHUB_STEP_SUMMARY
          echo "- 目标路径: federation/awen/" >> $GITHUB_STEP_SUMMARY
          echo "- 方式: 主仓库拉取" >> $GITHUB_STEP_SUMMARY
          echo "- 时间: $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S CST')" >> $GITHUB_STEP_SUMMARY
```

### Step 2 · 简化 Awen 的仓库工作流

**Awen 仓库不再需要推送到主仓库。** 可以把原来的 `bridge-sync.yml` 简化为只发一个通知：

将 Awen 仓库的 `.github/workflows/bridge-sync.yml` 替换为：

```yaml
# 🌊 Awen 仓库变更通知
# 每次 push 后通知主仓库拉取

name: "📢 Notify GuanghuLab"

on:
  push:
    branches: [main]

jobs:
  notify-main-repo:
    runs-on: ubuntu-latest
    steps:
      - name: "📢 Trigger Pull Sync"
        env:
          MAIN_REPO_TOKEN: $\{\{ secrets.MAIN_REPO_TOKEN \}\}
        run: |
          curl -X POST \
            -H "Accept: application/vnd.github+json" \
            -H "Authorization: Bearer ${MAIN_REPO_TOKEN}" \
            https://api.github.com/repos/qinfendebingshuo/guanghulab/dispatches \
            -d '{"event_type": "awen-sync"}'
          
          echo "✅ 已通知主仓库拉取同步"
```

### Step 3 · 测试验证

1. 先在主仓库手动触发 `Pull Sync from Awen` 工作流，确认拉取成功
2. 然后让 Awen 推送一次代码，确认自动触发主仓库拉取
3. 检查主仓库 `federation/awen/workspace/` 目录是否出现文件

---

## 🔄 同步流程图

```
Awen push 代码
    ↓
Awen Actions: 发 repository_dispatch 事件
    ↓
GuanghuLab Actions: 收到事件 → 拉取 Awen 仓库 → 复制到 federation/awen/ → commit + push
    ↓
✅ 同步完成
```

---

<aside>
💡

**这个方案同样适用于其他开发者仓库（小兴、之之、桔子等）。**

只需在主仓库复制一份 workflow，改一下仓库地址和同步目录名即可。

后续可统一为模板。

</aside>