如何将两个Git仓库作为单仓库管理同时保持相互独立?
实现方案
1. 先调整本地仓库远程配置
把原来指向GitHub主题的远程仓库重命名为upstream(专门用于拉取主题更新),你的GitLab仓库设为默认origin:
# 重命名原有GitHub主题远程源 git remote rename origin upstream # 新增自己的GitLab仓库为默认源 git remote add origin <你的GitLab仓库地址>
设置本地分支跟踪规则:
- 本地
master分支继续跟踪upstream/master,仅用于拉取主题更新,不做修改 - 你的内容分支(假设命名为
content)跟踪origin/content,用于存放你的私有内容
# 配置master分支跟踪上游主题源 git branch -u upstream/master master # 推送内容分支到自己的GitLab仓库并绑定跟踪关系 git checkout content git push -u origin content
2. 适配GitLab Pages的master分支要求
推荐用GitLab CI自动完成主题+内容的合并发布,全程不需要你手动操作master分支:
在你的content分支根目录新建.gitlab-ci.yml文件,写入以下配置:
stages: - deploy pages: stage: deploy image: alpine/git only: - content script: # 配置Git身份 - git config user.name "GitLab CI" - git config user.email "ci@example.com" # 添加上游主题源 - git remote add upstream <GitHub主题仓库地址> - git fetch upstream # 基于上游最新master创建临时分支 - git checkout -b publish upstream/master # 合并你的内容分支,冲突优先保留你的内容修改 - git merge -X ours content --allow-unrelated-histories # 推送到当前仓库的master分支触发Pages构建 - git push https://$CI_PUSH_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git publish:master -f artifacts: paths: - public
注:你需要提前在GitLab仓库的设置里生成有读写权限的
CI_PUSH_TOKEN变量,保证CI可以推送代码到master分支。
如果你不想用CI,也可以在本地写一个一键发布脚本,每次需要更新Pages时执行即可:
#!/bin/bash git checkout master git pull upstream master git checkout -b publish git merge -X ours content git push origin publish:master -f git checkout content git branch -D publish
3. 后续主题更新流程
每次上游主题发布新版本,你只需要按以下步骤操作即可:
- 切到master分支拉取最新主题代码:
git checkout master && git pull upstream master - 切回content分支合并主题更新,手动解决适配冲突:
git checkout content && git merge master - 适配完成后推送到GitLab的content分支,CI会自动完成合并发布,无需其他操作
方案匹配需求说明
- 主题和内容完全独立维护:上游主题存放在
upstream源,你的内容全部在content分支,二者没有强制绑定关系 - 日常开发只需要在
content分支操作,完全基于主题做自定义修改,不会污染主题代码 - GitLab的master分支由CI自动合并主题+内容生成,完全满足GitLab Pages的构建要求
- 主题更新可以单独拉取,适配完成后再发布,不会覆盖你的已有内容
内容的提问来源于stack exchange,提问作者Ender
相关产品推荐
相关产品推荐

