如何从私有开发Git仓库创建干净发布仓库并同步更新?
嘿,这个需求其实挺常见的——既要把核心功能公开,又不想泄露开发版的特性,还得跟着开发仓库同步更新对吧?我给你整理了几个Git原生的靠谱方案,按需选就行:
方案1:用git filter-repo生成干净的发布仓库(推荐,替代老旧的filter-branch)
这个方法会直接生成一个只保留你需要文件的仓库,同时保留和开发仓库的关联,后续拉取更新也很方便。
步骤1:先克隆开发仓库到本地临时目录
别直接动你的开发仓库,先搞个临时副本:
git clone <你的开发仓库地址> dev-temp cd dev-temp
步骤2:列出要排除的文件/目录
创建一个叫exclude-list.txt的文件,把不需要的内容一行一个列出来:
# 举个例子,这些是要排除的内容 dev-only-features/ debug-tools/ local-dev-config.yml test-suite/
步骤3:用git filter-repo过滤仓库
这个命令会重写仓库历史,彻底移除你列的那些内容:
git filter-repo --invert-paths --paths-from-file exclude-list.txt
注意:这个操作会修改本地仓库的历史,所以只在临时副本里做,绝对别在你的主开发仓库上执行!
步骤4:推送到你的发布仓库
现在临时仓库已经是干净的发布版本了,把它推到你的公开发布仓库:
# 添加发布仓库作为远程 git remote add publish <你的发布仓库地址> # 推送主分支(如果你的分支名是master就换成master) git push publish main --force
步骤5:后续同步开发仓库的更新
每次开发仓库有新变更时,重复以下步骤就行:
- 删除旧的临时目录,重新克隆开发仓库
- 再次执行
git filter-repo过滤 - 推送到发布仓库覆盖旧版本
小技巧:把这些步骤写成一个shell脚本,一键执行,省得每次手动敲命令。
方案2:用git subtree split拆分指定目录(适合发布特定子目录)
如果你的发布内容是开发仓库里的几个明确子目录(比如只公开src/和docs/),这个方法更精准,不用列排除列表。
步骤1:在开发仓库中拆分目录为独立分支
# 把src/和docs/这两个目录拆成一个叫release-branch的分支 git subtree split --prefix=src --prefix=docs -b release-branch
步骤2:推送到发布仓库
# 把release-branch推送到发布仓库的main分支 git push <你的发布仓库地址> release-branch:main
步骤3:后续同步更新
每次开发仓库有新变更,重新拆分并推送:
# --rejoin参数会把拆分的分支合并回主分支,方便下次拆分 git subtree split --prefix=src --prefix=docs -b release-branch --rejoin git push <你的发布仓库地址> release-branch:main --force
方案3:维护开发仓库的发布分支(适合频繁同步)
如果需要非常频繁地同步开发变更,可以在开发仓库里专门维护一个发布分支,每次合并主分支后清理不需要的文件:
步骤1:在开发仓库创建发布分支
git checkout -b release-branch
步骤2:创建清理脚本
写一个简单的shell脚本(比如clean-release.sh),用来删除不需要的文件:
#!/bin/bash # 删除开发版特性目录 rm -rf dev-only-features/ # 删除调试工具 rm -rf debug-tools/ # 删除本地配置 rm local-dev-config.yml
给脚本加执行权限:chmod +x clean-release.sh
步骤3:合并开发分支并清理
每次主分支有更新,就合并到release-branch并清理:
git checkout release-branch git merge main # 执行清理脚本 ./clean-release.sh # 提交清理后的变更 git add . git commit -m "Clean up release files after merge" git push origin release-branch
步骤4:发布仓库关联这个分支
在发布仓库的本地克隆里,把开发仓库的release-branch设为上游:
git clone <发布仓库地址> publish-repo cd publish-repo git remote add dev-upstream <你的开发仓库地址> git pull dev-upstream release-branch git push origin main
之后每次同步,直接拉取dev-upstream的release-branch就行。
注意:这个方法不会修改仓库历史,所以不会有强制推送的问题,但每次合并后都要手动(或脚本)清理文件,适合变更频繁的场景。
内容的提问来源于stack exchange,提问作者rugermini

