如何从指定commit复制Git仓库并创建不含敏感提交的公开版本
结论
完全可行,整个操作不会修改你本地及私有远程仓库的原有提交记录,可以同时保留完整的私有版本和裁剪后的公开版本。
操作步骤
1. 同步本地私有仓库提交
进入本地私有仓库目录,确保当前master分支和私有远程完全同步:
git checkout master git pull origin master
运行git log --oneline查看提交历史,记录提交B的短哈希值(比如示例中的ba98765):
edcba98 (HEAD -> master) E dcba987 D cba9876 C ba98765 B a987654 A (初始提交)
2. 生成裁剪后的提交链
基于当前master分支创建专门用于公开推送的新分支:
git checkout -b public-master
运行交互式变基命令,删除A、B两个提交:
# 命令中的ba98765替换为你上一步记录的提交B的哈希值 git rebase -i ba98765^ public-master
执行命令后会弹出文本编辑器,删除A、B对应的两行记录,保存并关闭编辑器后,git会自动生成以C为初始提交的新提交链C->D->E。
你可以运行git log --oneline验证结果,确认输出仅包含C、D、E三个提交即可。
3. 推送到公开远程仓库
在GitHub创建空的公开仓库,不要勾选初始化README、.gitignore、LICENSE等任何文件,回到本地仓库添加公开远程并推送:
# 添加公开远程,地址替换为你自己的公开仓库SSH/HTTPS地址 git remote add public-origin git@github.com:你的用户名/公开仓库名.git # 将裁剪后的分支推送到公开远程的master分支 git push public-origin public-master:master
4. 恢复原有私有分支
操作完成后切换回原master分支,即可看到完整的A->B->C->D->E提交链,和操作前完全一致:
git checkout master
后续同步说明
如果后续私有仓库新增了提交需要同步到公开仓库,执行以下命令即可:
git checkout public-master # 拉取私有仓库最新提交 git pull origin master # 将新提交变基到裁剪后的分支 git rebase master # 推送到公开远程 git push public-origin master
注意事项
- 操作前建议备份完整的本地仓库,避免误操作导致提交丢失
- 不要将
public-master分支推送到你的私有远程,避免覆盖私有仓库的原有提交记录 - 公开仓库不要直接提交修改,所有修改都在私有仓库的
master分支完成后,按上述同步步骤同步即可
内容的提问来源于stack exchange,提问作者Oganesson118
相关产品推荐
相关产品推荐

