gl-gh-synclisted
Install: claude install-skill AgentsMesh/AgentsMesh
# GL-GH-Sync —— GitLab / GitHub 双仓库同步流程
将 GitLab(origin)和 GitHub(github)的 main 分支保持同步。
**核心策略:**
- **一方领先(fast-forward)**→ 直接 `git push`,零额外 commit
- **两边分叉**→ 走 PR/MR 流程,需人工决策
## 使用方式
```
/gl-gh-sync # 自动检测方向并同步
/gl-gh-sync --status # 仅查看两边差异,不执行同步
```
## 同步流程
### 第一步:获取最新状态
```bash
git fetch origin main
git fetch github main
# 查看两边差异
git log --oneline origin/main..github/main # GitHub 有但 GitLab 没有
git log --oneline github/main..origin/main # GitLab 有但 GitHub 没有
```
### 第二步:判断同步方向
```bash
GITLAB_AHEAD=$(git rev-list --count github/main..origin/main)
GITHUB_AHEAD=$(git rev-list --count origin/main..github/main)
echo "GitLab 领先 GitHub: $GITLAB_AHEAD 个提交"
echo "GitHub 领先 GitLab: $GITHUB_AHEAD 个提交"
```
根据结果选择策略:
- **两边相同**(均为 0)→ 已同步,无需操作
- **仅 GitLab 领先**→ 直接推送到 GitHub
- **仅 GitHub 领先**→ 直接推送到 GitLab
- **两边都有新提交(分叉)**→ 需人工决策,询问用户
### 第三步-A:GitLab → GitHub(直接推送)
一方严格领先时,直接推送即可保持 commit hash 完全一致,无额外 merge commit。
```bash
# 直接将 GitLab main 推送到 GitHub main(fast-forward)
git push github origin/main:main
```
### 第三步-B:GitHub → GitLab(直接推送)
```bash
# 直接将 GitHub main 推送到 GitLab main(fast-forward)
git push origin github/main:main
```
> **注意:** 如果 GitLab main 有 protected branch 规则阻止直接推送,
> 则回退到 MR 流程(见"分叉处理"章节),但需注意 MR 合并产生的
> merge commit 需要再同步回 GitHub。
### 第四步:验证同步结果
```bash
git fetch origin main
git fetch github main
DIFF=$(git rev-list origin/main...github/main --count)
if [ "$DIFF" -eq 0 ]; then
echo "✅ 同步成功:两边 main 分支完全一致"
git log --onel