# github2gitee **Repository Path**: drx000/github2gitee ## Basic Information - **Project Name**: github2gitee - **Description**: 同步github项目到gitee - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-07 - **Last Updated**: 2026-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GitHub2Gitee 把 GitHub 上的项目镜像同步到你的 Gitee 仓库的 Windows 桌面应用(Local-first)。 - **同步机制**:Git 镜像同步 —— 本地 bare 镜像 + `fetch`(全部分支与标签,可 `--prune`)+ `push --mirror`,天然增量。 - **架构**:Rust 同步引擎(cdylib + C ABI,含独立 CLI)←P/Invoke→ C# .NET 10 核心层 → WinUI 3 UI 壳。 - **安全**:GitHub/Gitee PAT 经 Windows DPAPI(CurrentUser)加密落盘;同步时令牌仅经环境变量注入一次性 git credential helper,不写 `.git/config`、不进命令行参数、日志自动脱敏。 - **发布**:已实测 **Native AOT**(.NET 10 + Windows App SDK 2.4.0),产物为原生可执行文件。 ## 环境前提 | 工具 | 版本 | 用途 | |------|------|------| | Windows | 10 (19041+) / 11,x64(ARM64 配置保留,未实测) | 运行平台 | | .NET SDK | 10.0+ | 构建 C# | | Rust(rustup) | 1.80+(实测 1.95) | 构建引擎 `g2g_sync.dll` | | Git for Windows | 2.x(实测 2.47) | 实际执行同步 | > 构建任一 C# 工程时,`Directory.Build.targets` 会自动执行 `cargo build --release` 并把 `g2g_sync.dll` 复制到输出目录,无需手工步骤。 ## 构建与测试 ```bash dotnet build GitHub2Gitee.sln -c Debug # 全解决方案(含 WinUI XAML 编译) dotnet test GitHub2Gitee.sln -c Debug # C# 测试(23 项) cargo test --manifest-path native/g2g-sync/Cargo.toml # Rust 测试(18 项,本地 fixture 不依赖外网) ``` ## 运行 ```bash dotnet run --project src/GitHub2Gitee.App -c Debug -p:Platform=x64 ``` 或直接运行发布产物(自包含 Windows App SDK,无需安装 WASDK Runtime): ``` dist/GitHub2Gitee.exe ``` 发布产物为可移植布局(design D-10):根目录仅一个启动器 `GitHub2Gitee.exe`(197KB), 真实应用与全部依赖/资源位于同级 `app\` 目录;启动器负责拉起 `app\GitHub2Gitee.App.exe` 并等待其退出。`dotnet publish` 自动完成该布局(见 App.csproj 的 PublishDir 与 Directory.Build.targets 的启动器注入)。 ## 发布(Native AOT,已实测) ```bash dotnet publish src/GitHub2Gitee.App -c Release -r win-x64 -p:Platform=x64 -p:PublishAot=true ``` ## CLI 诊断模式(FR-7) ```bash # request.json 为 SyncRequest JSON(camelCase),响应输出 SyncResponse JSON native/g2g-sync/target/release/g2g-engine --input request.json cat request.json | native/g2g-sync/target/release/g2g-engine ``` 请求示例: ```json { "jobs": [ { "repoId": "r1", "githubUrl": "https://github.com/owner/repo.git", "giteeUrl": "https://gitee.com/owner/repo.git", "githubToken": "…", "giteeToken": "…", "mirrorDir": "C:/path/mirrors/owner__repo", "prune": true } ], "concurrency": 2 } ``` ## 使用说明 1. **设置页**:录入 GitHub PAT 与 Gitee PAT(保存后 DPAPI 加密存储)。 - GitHub PAT:classic `repo` scope,或 fine-grained 对目标仓库 `Contents: RW`。 - Gitee PAT:勾选 `projects`(仓库读写)权限。 2. **仓库映射页**:添加映射(GitHub `owner/repo` → Gitee `owner/repo`),点击"同步"或"同步全部"。 3. **同步历史页**:查看每一步(建立镜像 / fetch / push)的结果、耗时与错误明细。 4. **自动同步**(可选):设置页开启后,应用运行期间按间隔自动同步启用的映射。 ## 数据目录(Local-first) 默认 `%LOCALAPPDATA%\GitHub2Gitee\`: | 文件 | 内容 | |------|------| | `mappings.json` | 仓库映射 | | `settings.json` | 应用设置 | | `history.jsonl` | 同步历史(500 条环形) | | `tokens.json` | DPAPI 加密后的令牌密文 | | `mirrors/` | 本地 bare 镜像 | ## 注意事项与已知边界 - **Gitee 目标仓库建议建为空仓库**:若目标已含提交且分支受保护,`push --mirror` 可能被服务端拒绝(错误会呈现在同步历史中)。 - 不镜像 `refs/pull/*`(GitHub PR 引用命名空间,规避 Gitee 拒绝风险);分支与标签全部镜像。 - 令牌只在同步请求报文(内存)与加密文件中出现;删除映射不会删除本地镜像目录(重建幂等,可手动清理)。 - 系统托盘、Gitee Import API 降级路径、ARM64 实测:见 requirements FR-8(P2,v1 未实现)。 ## 设计文档 见 `docs/dev/github-gitee-sync/`(requirements / design / tasks)。