在 Manus 中运行任何 Skill
一键导入
一键导入
一键在 Manus 中运行任何 Skill
开始使用$pwd:
gl-gh-sync
// 在 GitLab(内部)和 GitHub(开源)之间双向同步代码。 自动检测哪边有新提交,fast-forward 场景直接推送,分叉场景走 PR/MR 流程。
$ git log --oneline --stat
stars:2,163
forks:212
updated:2026年3月2日 10:25
SKILL.md
// 在 GitLab(内部)和 GitHub(开源)之间双向同步代码。 自动检测哪边有新提交,fast-forward 场景直接推送,分叉场景走 PR/MR 流程。
将当前分支合并到 GitHub 目标分支(通常是 main)。 自动处理代码提交、创建 PR、监控 CI Checks、处理错误直到合并成功。
执行 E2E 测试用例。 根据测试用例的验证类型(ui/api/database)选择正确的工具执行验证。
创建 Git worktree 用于隔离开发新功能或修复 bug。 自动处理分支创建、worktree 设置、目录切换和开发环境初始化。
将当前分支合并到目标分支(通常是 main)。 自动处理代码提交、创建 MR、监控 Pipeline、处理错误直到合并成功。
| name | gl-gh-sync |
| description | 在 GitLab(内部)和 GitHub(开源)之间双向同步代码。 自动检测哪边有新提交,fast-forward 场景直接推送,分叉场景走 PR/MR 流程。 |
| user-invocable | true |
将 GitLab(origin)和 GitHub(github)的 main 分支保持同步。
核心策略:
git push,零额外 commit/gl-gh-sync # 自动检测方向并同步
/gl-gh-sync --status # 仅查看两边差异,不执行同步
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 没有
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 个提交"
根据结果选择策略:
一方严格领先时,直接推送即可保持 commit hash 完全一致,无额外 merge commit。
# 直接将 GitLab main 推送到 GitHub main(fast-forward)
git push github origin/main:main
# 直接将 GitHub main 推送到 GitLab main(fast-forward)
git push origin github/main:main
注意: 如果 GitLab main 有 protected branch 规则阻止直接推送, 则回退到 MR 流程(见"分叉处理"章节),但需注意 MR 合并产生的 merge commit 需要再同步回 GitHub。
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 --oneline -3 origin/main
else
echo "⚠️ 仍有差异,请检查"
fi
当 GitLab 和 GitHub 都有对方没有的提交时:
echo "⚠️ 两个仓库出现分叉!"
echo ""
echo "GitLab 独有提交:"
git log --oneline github/main..origin/main
echo ""
echo "GitHub 独有提交:"
git log --oneline origin/main..github/main
询问用户选择策略:
处理分叉示例(以 GitLab 为准):
BRANCH="sync/resolve-diverge-$(date +%Y%m%d-%H%M%S)"
# 基于 GitLab main 创建解决分叉分支
git checkout -b "$BRANCH" origin/main
# 将 GitHub 的独有提交 cherry-pick 进来
git cherry-pick <github-commit-1> <github-commit-2> ...
# 如有冲突,解决后继续
git cherry-pick --continue
# 推送到 GitLab(通过 MR 或直接推送)
git push origin "$BRANCH"
glab mr create --source-branch "$BRANCH" --target-branch main \
--title "sync: resolve divergence ($(date +%Y-%m-%d))" --yes
# MR 合并后,将统一后的 main 直接推送到 GitHub
git fetch origin main
git push github origin/main:main
# 1. 获取两边最新状态
git fetch origin main && git fetch github main
# 2. 检查差异
GITLAB_AHEAD=$(git rev-list --count github/main..origin/main)
GITHUB_AHEAD=$(git rev-list --count origin/main..github/main)
echo "GitLab 领先: $GITLAB_AHEAD | GitHub 领先: $GITHUB_AHEAD"
# 3a. GitLab 领先 → 直接推送到 GitHub
if [ "$GITLAB_AHEAD" -gt 0 ] && [ "$GITHUB_AHEAD" -eq 0 ]; then
git push github origin/main:main
# 3b. GitHub 领先 → 直接推送到 GitLab
elif [ "$GITHUB_AHEAD" -gt 0 ] && [ "$GITLAB_AHEAD" -eq 0 ]; then
git push origin github/main:main
# 3c. 两边分叉 → 需要人工决策
elif [ "$GITLAB_AHEAD" -gt 0 ] && [ "$GITHUB_AHEAD" -gt 0 ]; then
echo "⚠️ 分叉!请选择同步策略"
fi
# 4. 验证
git fetch origin main && git fetch github main
[ "$(git rev-parse origin/main)" = "$(git rev-parse github/main)" ] && \
echo "✅ 两边完全一致" || echo "⚠️ 仍有差异"
✅ 同步完成
同步方向: GitLab → GitHub
同步方式: 直接推送(fast-forward)
最终状态:
origin/main (GitLab): ff6fef1d
github/main (GitHub): ff6fef1d
✅ 两边 main 分支完全一致