更新Git镜像时保留GitHub端新增的.github目录
解决BitBucket到GitHub同步时保留.github目录的问题
核心思路
放弃使用会完全覆盖仓库状态的git push --mirror命令,改用选择性合并+保留指定目录的方式,把BitBucket的代码变更同步到GitHub,同时保住GitHub端独有的.github流水线目录。
具体操作步骤
1. 本地配置双远程仓库
先克隆你的GitHub仓库,再把BitBucket仓库添加为远程源:
git clone git@github.com:<你的GitHub用户名>/<仓库名>.git cd <仓库名> git remote add bitbucket git@bitbucket.org:<你的BitBucket用户名>/<仓库名>.git
2. 拉取BitBucket的所有变更
把BitBucket仓库的所有分支和提交历史拉到本地:
git fetch bitbucket
3. 合并分支并保留.github目录(以main分支为例)
切换到GitHub的main分支,合并BitBucket的main分支变更,遇到冲突时强制保留本地.github目录的内容:
git checkout main git merge bitbucket/main --strategy-option theirs=.github/**
这里的--strategy-option theirs=.github/**是核心参数,专门指定在.github目录相关的冲突中,用本地(GitHub端)的内容覆盖BitBucket的内容,避免流水线配置被删掉。
4. 推送合并后的内容到GitHub
把合并好的分支推回GitHub仓库:
git push origin main
5. 自动化定期同步(可选)
如果需要自动同步,在GitHub仓库的.github/workflows目录下新建sync-bitbucket.yml,内容如下:
name: 同步BitBucket代码到GitHub on: schedule: - cron: '0 */6 * * *' # 每6小时自动同步一次,可按需调整 workflow_dispatch: # 支持手动触发同步 jobs: sync-code: runs-on: ubuntu-latest steps: - name: 拉取GitHub仓库代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取完整提交历史 - name: 添加BitBucket远程源 run: git remote add bitbucket https://x-token-auth:${{ secrets.BITBUCKET_TOKEN }}@bitbucket.org/<你的BitBucket用户名>/<仓库名>.git - name: 拉取BitBucket最新变更 run: git fetch bitbucket - name: 合并变更并保留.github目录 run: | git checkout main # 合并时自动处理冲突,保留.github内容,合并失败也不中断流程 git merge bitbucket/main --strategy-option theirs=.github/** || true git push origin main
记得在GitHub仓库的「Settings → Secrets and variables → Actions」里添加BITBUCKET_TOKEN,用于授权访问BitBucket仓库。
关键注意事项
- 绝对不要用
git push --mirror,它会完全复刻BitBucket的仓库状态,直接删掉GitHub端所有独有的文件和目录。 - 如果需要同步多个分支,重复步骤3-4即可,或者在自动化工作流里添加分支循环逻辑。
- 合并前可以先执行
git diff main bitbucket/main查看变更内容,确保没有意外冲突。
内容的提问来源于stack exchange,提问作者Max Schmidt
相关产品推荐
相关产品推荐

